如何在CakePHP控制器中为某些操作创建自定义路由?

时间:2010-07-29 02:50:03

标签: url cakephp routing conventions

来自Django,我习惯于以任何我认为合适的方式组织我的URL路由。例如,用户注册将存在于/users/网址。

/users/
/users/registration/
/users/registration/optin/
/users/registration/thankyou/

但是,我正在CakePHP中创建用户注册系统,并且url路由的默认约定行为是/controller/action/。这会产生:

/users/
/users/registration/
/users/optin/
/users/thankyou/

如何在某些操作上实现/controller/action/custom/样式网址路由(其中/custom/是子部分,而不是参数)?我是否应该期待这样做,还是我只是在与大会抗争?

1 个答案:

答案 0 :(得分:2)

/controller/action/custom/默认工作正常 它调用ControllerController::action('custom')

如果您正在寻找通过网址UsersController::thankyou()调用/users/registration/thankyou之类的内容,您可以制定合适的路线:

Router::connect('/users/registration/thankyou',
                array('controller' => 'users', 'action' => 'thankyou'));

您可以在一个规则中对路线进行分组,如下所示:

// Routes /users/registration/optin and /users/registration/thankyou to
// UsersController::optin() and UsersController::thankyou() respectively
Router::connect('/users/registration/:action',
                array('controller' => 'users'),
                array('action' => '(optin|thankyou)'));

路由非常强大,并且在Cake中非常灵活。一如既往,研究手册:
http://book.cakephp.org/view/945/Routes-Configuration


基础知识是路由器匹配路由,例如'/users/registration/:action',针对当前网址,包括第三个参数中指定的条件,例如'action' => '(optin|thankyou)':action部分必须与RegEx /^(optin|thankyou)$/匹配 如果匹配,则会将第二个参数的默认值与从URL中提取的任何信息合并,因此您可以获得array('controller' => 'users', 'action' => 'thankyou')。 然后它将其推送到CakeRoute::parse,这构造了在控制器中执行debug($this->params)时可以看到的数组。此数组用于确定要加载哪个Controller以及要调用的操作。

基本的RegEx和参数匹配已经非常强大,但您可以通过继承CakeRoute并提供自定义parse函数来完全疯狂,如本手册末尾简要说明的那样。 :)