Zend框架动态动作名称路由


Zend Framework dynamic action name routing

我的网站允许您创建项目,并且有多种项目类型(如项目模板)。

我想做的是有一个单一的操作处理所有的项目类型。目前,对于每个项目类型,我都有一个单独的操作和视图。我想把它们都路由到一个动作

这是我到目前为止想出的方法,这行不通。

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]+)"

所以我希望我的url看起来像http://mysite.com/project/new-1http://mysite.com/project/new-2,其中1和2是项目类型id。这两个url都应该映射到project控制器中称为new的操作。

像这样的东西可能在ZF 1.11?

您想要的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

看起来您不能将URL变量指定为部分-它们必须占据整个段(其中段由/分隔)-也就是说,第一个字符必须是:,然后名称是值的其余部分。

参见Zend/Controller/Router/Route.php中的__construct函数(第158..196行)-它只检查substr($part, 0, 1)是否与:匹配,(而不是在段中的任何地方查找它)。


我认为这意味着你需要在Zend中使用/project/new/:id来使用相同的操作-你可以在Apache中使用mod_rewrite来将/project/new-('d+)这样的url呈现给用户,但为Zend重写为/project/new/$1