2014-12-24 82 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幫助。我知道是什麼導致了這個錯誤,但不知道爲什麼這些規則搞亂了。從來不太瞭解正則表達式。 –