我遇到这个问题,其中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',
列出目录中所有产品的规则不会引发相同的错误消息,但查看产品的规则有效。
提前感谢您的帮助。
答案 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
不是数字),但将匹配第二个规则。这是你正在寻找的行为。