如何为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
函数完全疯狂,正如手册末尾所简述的那样。 :)
我一直在阅读路线,但作为Cake的新手,很多组件之间的连接并不总是很明显。 Cake先生做了很多魔术,这让我想知道当我需要移出常规时它究竟在做什么。 (我正在阅读食谱,但我只能读得这么快) – Soviut 2010-07-29 03:25:23
@Soviut是的,这是一个非常复杂的话题,直到你得到它。增加了一些关于魔术的更多解释,希望有所帮助。 – deceze 2010-07-29 03:49:31
谢谢。你有我的投票和我的接受!我只希望Cake文档能够告诉我完成任何事情的艰难方法,然后向我展示简单的方法。首先显示简单的方法倾向于平息人们,然后当他们需要在公约之外做事时卡住。 – Soviut 2010-07-29 05:09:03