0

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

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

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

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-1or http://mysite.com/project/new-2,其中 1 和 2 是项目类型 ID。这两个 URL 都应该映射到控制器中调用new的操作。project

ZF 1.11 中是否有可能发生这样的事情?

4

2 回答 2

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 。

于 2013-03-07T13:36:58.263 回答
1

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

请参阅(第 158..196 行)__construct中的函数 - 它仅检查是否匹配,(而不是在段内的任何位置查找它)。Zend/Controller/Router/Route.phpsubstr($part, 0, 1):


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

于 2013-03-07T12:36:26.430 回答