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

问题描述:

来自Django,我习惯于能够以我认为合适的方式来组织我的URL路由。例如,用户注册将存在于/users/网址下。如何为CakePHP控制器中的某些操作创建自定义路由?

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

不过,我创造CakePHP中,用户注册系统和URL路由的默认惯例的行为是/controller/action/。这产生了:

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

我如何能实现一些自己的行为(其中/custom/是一个小节,没有一个参数)的/controller/action/custom/风格的URL路由?我是否应该期待这样做,还是我只是在与这个大会作斗争呢?

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

如果你正在寻找的东西想通过URL /users/registration/thankyou调用UsersController::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',针对当前URL,包括第三个参数中指定的条件,例如'action' => '(optin|thankyou)':action部分必须与RegEx /^(optin|thankyou)$/匹配)。
如果匹配,它会将第二个参数的默认值与从URL中提取的任何信息合并,例如,您将获得array('controller' => 'users', 'action' => 'thankyou')
然后它通过CakeRoute::parse,它构建了在控制器中执行debug($this->params)时可以看到的阵列。该数组用于确定要加载哪个Controller以及要调用哪个动作。

基本正则表达式和参数匹配功能已经非常强大,但您可以通过继承CakeRoute并提供自定义parse函数完全疯狂,正如手册末尾所简述的那样。 :)

+0

我一直在阅读路线,但作为Cake的新手,很多组件之间的连接并不总是很明显。 Cake先生做了很多魔术,这让我想知道当我需要移出常规时它究竟在做什么。 (我正在阅读食谱,但我只能读得这么快) – Soviut 2010-07-29 03:25:23

+0

@Soviut是的,这是一个非常复杂的话题,直到你得到它。增加了一些关于魔术的更多解释,希望有所帮助。 – deceze 2010-07-29 03:49:31

+1

谢谢。你有我的投票和我的接受!我只希望Cake文档能够告诉我完成任何事情的艰难方法,然后向我展示简单的方法。首先显示简单的方法倾向于平息人们,然后当他们需要在公约之外做事时卡住。 – Soviut 2010-07-29 05:09:03