3

Ok, I am transitioning an app from yii 1.1 to yii 2, unfortunately I cannot figure out how to use optional parameters within my url routes. Even when I set defaults in the urlmanager in config I can't state the second parameter without the first one or I end up with a 404 error.

Is there a way to replicate optional url parameter rules such as

array( '<controller:\w+>/<action:\w+>?(/<status>)?',
'pattern' => '<controller>/<action>'                   
),

in yii 2 ?

4

3 回答 3

7

这在文档中不是很清楚(请参阅http://www.yiiframework.com/doc-2.0/guide-runtime-routing.html),但这是答案:

默认情况下,规则中声明的所有参数都是必需的。如果请求的 URL 不包含特定参数,或者如果创建的 URL 没有特定参数,则该规则将不适用。要使某些参数成为可选参数,您可以配置规则的默认属性。此属性中列出的参数是可选的,并且在未提供时将采用指定的值。

所以你的路线必须表达为:

array(
  'pattern' => '<controller:\w+>/<action:\w+>/<status>',
  'route' => '<controller>/<action>',
  'defaults' => array('status' => '<a default value for status>')
)
于 2015-08-17T08:23:04.547 回答
0

如果您不想使用 Default 并坚持使用简短语法,则可以定义 2 条规则,确保“较长”规则在列表中较高:

rules : [
    <controller:\w+>/<action:\w+>/<status> => '<controller>/<action>',
    <controller:\w+>/<action:\w+> => '<controller>/<action>',
]

如果第一个规则将 URL 与status元素匹配并将您发送到控制器/操作,它将触发。
如果跳过第一个规则,将触发第二个规则。确保您的方法具有 $status 的默认值。

于 2022-02-04T12:08:36.957 回答
0

经过大量搜索后,我找到了这个解决方案。在您的规则中,您必须设置两个参数:

array(   
   'pattern' => '<controller: \w+>/<action:\w+>/<status>',    
   'route' => '<controller>/<action>',   
),
array(
   'pattern' => '<controller:\w+><action:\w+>',
   'route => '<controller>/<action>',  
)

然后转到您的控制器操作并添加以下内容:

public function action...(/*Your inputs except status*/)
$get = Yii::$app->request->get();
$status = $get['status'] ?? null;

然后您可以检查$status没有默认值的值。
注意:如果您的参数是后参数更改get()post().

于 2021-03-21T10:32:59.790 回答