Yii 2可选参数

0vvn1miw  于 2022-11-09  发布在  其他
关注(0)|答案(3)|浏览(178)

好的,我正在把一个应用从Yii 1.1转换到Yii 2,不幸的是我不知道如何在我的url路由中使用可选参数。即使我在配置中的urlmanager中设置了默认值,我也不能在没有第一个参数的情况下声明第二个参数,否则我会以404错误结束。
是否有方法复制可选的url参数规则(如

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

在Yii 2中?

zaq34kh6

zaq34kh61#

这在文档中不是很清楚(请参见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>')
)
oyxsuwqo

oyxsuwqo2#

经过大量的搜索我找到了这个solution.in你的规则你必须设置两个参数:

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()

doinxwow

doinxwow3#

如果您不想使用默认值而坚持使用短语法,则可以定义2个规则,确保“较长”的规则在列表中位于较高位置:

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

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

相关问题