2013-03-07 101 views
0

我的站點允許您創建項目,並且有多個項目類型(如項目模板)。Zend Framework動態操作名稱路由

我想要做的是有一個處理所有項目類型的單個動作。目前,對於每個項目類型,我都有一個單獨的操作和視圖。我想把他們全部路由到一個單一的行動。

這是我到目前爲止,這是行不通的。

resources.router.routes.new_project.route = "/project/new-:id" 
resources.router.routes.new_project.defaults.controller = "project" 
resources.router.routes.new_project.defaults.module = "site" 
resources.router.routes.new_project.defaults.action = "new" 
resources.router.routes.new_project.reqs.id = "([0-9]+)" 

所以我想我的網址看起來像http://mysite.com/project/new-1http://mysite.com/project/new-2,其中1和2是項目類型ID。這兩個URL都應映射到project控制器中名爲new的操作。

在ZF 1.11中可以這樣做嗎?

回答

2

你想要的URL格式可以很容易地使用正則表達式的路由來實現的:

resources.router.routes.new_project.type = "Zend_Controller_Router_Route_Regex" 
resources.router.routes.new_project.route = "project/new-(\d+)" 
resources.router.routes.new_project.defaults.controller = "project" 
resources.router.routes.new_project.defaults.module = "site" 
resources.router.routes.new_project.defaults.action = "new" 
resources.router.routes.new_project.map.1 = "project_type_id" 
resources.router.routes.new_project.reverse = "project/new-%s" 

然後,您可以訪問你的控制器使用$this->_getParam('project_type_id')的ID。

+0

*幾乎*我想出了。這對我不起作用,所以在'new_project.route'中,我刪除了開始的斜槓,並以'^ project/new - (\ d +)'結尾。 – 2013-03-07 14:27:51

+0

是的,你說得很對,我從我的答案中刪除了這些。在進行路線匹配之前,ZF實際上將它們剝離,但是您可能在組裝路線中以雙斜線結束。 – 2013-03-07 14:31:25

1

看起來您不能將URL變量指定爲零件 - 它們必須佔據整個分段(其中分段由/分隔) - 也就是說,第一個字符必須是:,並且名稱是餘下的的價值。

見功能__constructZend/Controller/Router/Route.php(線158..196) - 如果substr($part, 0, 1)匹配:它只檢查,(而不是段內的任何地方尋找它)。


我認爲這意味着你將需要使用/project/new/:id在Zend中使用相同的動作 - 你有可能使用mod_rewrite在Apache中,有一個像/project/new-(\d+)網址呈現給用戶,但改寫爲/project/new/$1爲Zend的。

+0

+1似乎是一個工作解決方案。我從Zend的'application.ini'文件中找到了適合我的東西。稍後將發佈。謝謝! – 2013-03-07 13:31:58