Yii url规则覆盖彼此

时间:2014-12-24 16:14:13

标签: php yii

我遇到这个问题,其中URL规则会相互覆盖。 我项目中需要的URL约定如下:

test.com/Products/Decorations/                           //for Catalog listings in that Category
test.com/Products/Decorations/Winter-Decorations/8       //for Product listings in that Catalog
test.com/Products/Decorations/8/christmas-tree-bell.html //for viewing exact products

我不是Yii网址管理专家,我知道有更好的方法可以做到这一点,但我的重写规则如下:

'/<rootCategory>/<categoryName>/<id>' => 'catalogs/index',
'/<rootCategory>/<categoryName>/<catalogTitle>/<id>' => 'products/index',
'/<rootCategory>/<categoryName>/<id>/<url_slug>' => 'products/view',

现在发生了什么,当规则按此顺序时,查看产品的规则不起作用。我收到一个错误:

  

500尝试获取非对象的属性。

但是,当我将最后一条规则向上移动时,就像这样:

'/<rootCategory>/<categoryName>/<id>' => 'catalogs/index',
'/<rootCategory>/<categoryName>/<id>/<url_slug>' => 'products/view',
'/<rootCategory>/<categoryName>/<catalogTitle>/<id>' => 'products/index',

列出目录中所有产品的规则不会引发相同的错误消息,但查看产品的规则有效。

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

您的第二个和第三个路由规则是重复的; Yii将始终匹配前一条规则,从而忽略另一条规则。您遇到的结果错误是因为参数与操作不匹配。

在规则中使用更具体的模式匹配,例如:

'/<rootCategory>/<categoryName>/<id:\d+>/<url_slug>' => 'products/view',
'/<rootCategory>/<categoryName>/<catalogTitle>/<id:\d+>' => 'products/index',

模式:\d+与数值匹配。使用上述规则,路径/Products/Decorations/Winter-Decorations/8匹配第一个规则(因为Winter-Decorations不是数字),但将匹配第二个规则。这是你正在寻找的行为。

请参阅"URL Rules" in Yii Framework 2.0 API Documentation