【发布时间】:2013-06-02 10:18:28
【问题描述】:
是否可以在 URL 中没有控制器的情况下进行页面路由,但其他控制器仍然可以工作?示例:
- 访问这样的页面:http://domain.com/about/
- 而不是这样:http://domain.com/pages/about/
- 但仍然可以访问http://domain.com/othercontroller/action/
执行以下操作可以使 URL 中没有 /pages/ 的页面,但如果我尝试访问任何其他控制器,它就不起作用:
- 发件人:
Router::connect('/pages/*', array('controller' => 'pages', 'action' => 'display')); - 收件人:
Router::connect('/', array('controller' => 'pages', 'action' => 'display', 'index'));
有没有办法设置路由器,以便它运行控制器/动作(如果存在)。如果没有,它会运行页面控制器/动作?
【问题讨论】:
-
我正在思考您的问题,但仍然无法完全理解。您想将 2 个不同的控制器 /w 操作与一个 URL 匹配吗?顺便说一句,您应该知道您可以使用哪些操作并相应地创建路线。从您问题的最后一行,我想您有包含控制器和操作的 URL,对吗?如果它不存在,您想从页面控制器运行一些操作吗?好吧,你看,我真的无法理解这一点,所以如果你以某种方式向我解释,我也许可以帮助你。
-
@luboss 感谢您的参与,对于我的表述不够清晰,我深表歉意。基本上我希望可以在domain.com/pagename 访问页面,但为此创建路由意味着如果我尝试访问控制器,它将无法工作,因为它认为控制器是一个页面。示例:对于domain.com/users/edit/1,Cake 会认为用户是一个页面而不是一个控制器......现在我选择了 Dave 的答案。我认为没有真正的“解决方案”。唯一的方法是明确告诉 Cake 哪些路由是页面。
-
好的,我现在明白了。我认为通过正则表达式匹配参数的能力是你能得到的最好的,所以是的,你做对了。但是,如果您像
Router::connect('/:pagename', array('controller' => 'Pages', 'action' => 'display'));这样定义路由并在显示操作中获取像这样$pagename = $this->params->pagename;这样的参数,则另一个 url (domain.com/users/edit/1) 将保持不受影响,因为它有额外的位,而不仅仅是以这种方式定义路由(/edit/1),只要您没有冲突的 url 匹配项,您就不必枚举页面名称。 -
当然,当尝试访问某些控制器(如 domain.com/users 而不是 domain.com/users/index)的索引功能时,它会影响 URL,但您可以通过在您定义的中添加一些独特的东西来解决这个问题页面通过给该 url 一个 .html 扩展名来路由或区分它。
标签: php cakephp cakephp-2.1