2014-12-24 62 views
0

我遇到了URL规则互相覆盖的问题。 的URL约定,我需要在我的项目如下:Yii 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的URL管理专家,我知道有一百万更好的方法可以做到这一点,但我重写规则如下:

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

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

500 Trying to get property of non-object.

但是当我移动最后一个规则一个,就像这样:

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

上市的所有产品在目录中的规则不起作用抛出同样的错误消息,但是查看产品的规则起作用。

非常感谢您的帮助。

回答

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

+0

非常感谢你,添加正则表达式的id帮助。我知道是什么导致了这个错误,但不知道为什么这些规则搞乱了。从来不太了解正则表达式。 –