要在URL中传递的Yii2变量-规则不起作用

要在URL中传递的Yii2变量-规则不起作用,yii2,yii2-advanced-app,yii2-basic-app,Yii2,Yii2 Advanced App,Yii2 Basic App,我有两个带参数的动作。我已经写了两个url规则,但一次只有一个有效。我不知道这个问题。这是我的看法, Site Controller中的索引操作,另一个是Product Controller中的索引操作 public function actionIndex($language = null) { /* some codes */ } public function actionIndex($id= null) { /* some codes */ } 'rules' =&g

我有两个带参数的动作。我已经写了两个url规则,但一次只有一个有效。我不知道这个问题。这是我的看法, Site Controller中的索引操作,另一个是Product Controller中的索引操作

public function actionIndex($language = null) {
    /* some codes */
}

public function actionIndex($id= null) {
    /* some codes */
}

'rules' => [
    '<language>' => 'site/index',
    '<id>' => 'product/index',
  ]
公共函数actionIndex($language=null){
/*一些代码*/
}
公共函数actionIndex($id=null){
/*一些代码*/
}
“规则”=>[
''=>'站点/索引',
''=>'产品/指数',
]

以上是我的url规则。但只有第一条规则有效。有什么问题吗?

您的规则不明确<代码>''模式将匹配每个URL,因此永远不会达到第二条规则。您应该为这两个规则创建不同的URL结构:

'rules' => [
    '<language>' => 'site/index',
    'id/<id>' => 'product/index',
],
“规则”=>[
''=>'站点/索引',
“id/”=>“产品/索引”,
],
或者使用不同的模式(仅文字语言和数字ID):

“规则”=>[
''=>'站点/索引',
''=>'产品/指数',
],

Pattern\w+也匹配数字。URL/100将使用第一条规则。在您的情况下,必须首先放置更严格的\d+模式。同样,在第一个示例中,您必须将“id/”规则置于“规则”之前。@MichalHynčica您关于
\w+
的说法是正确的,我修复了这个示例。但是
将不匹配
id/123
,因为斜杠总是被视为参数分隔符,所以第一个示例也可以,规则的顺序在这里不应该相关。第二个规则参数不是数字,它们也是字符。这两个规则参数都不是数字。不过,只有第一条规则有效。第二个url重定向到第一个操作。@SaabzCoder我的答案中的第一个示例应该适用于这种情况。您确定像
/id/someid
这样的URL由第一条规则处理吗?
'rules' => [
    '<language:[a-z]+>' => 'site/index',
    '<id:\d+>' => 'product/index',
],