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

Url 如何在CakePHP控制器中为某些操作创建自定义路由?,url,cakephp,routing,conventions,Url,Cakephp,Routing,Conventions,来自Django,我习惯于以我认为合适的方式组织我的URL路由。例如,用户注册将存在于/users/url下 /users/ /users/registration/ /users/registration/optin/ /users/registration/thankyou/ 但是,我正在CakePHP中创建一个用户注册系统,url路由的默认约定行为是/controller/action/。这将产生: /users/ /users/registration/ /users/optin/ /

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

/users/
/users/registration/
/users/registration/optin/
/users/registration/thankyou/
但是,我正在CakePHP中创建一个用户注册系统,url路由的默认约定行为是
/controller/action/
。这将产生:

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

如何在我的一些操作上实现
/controller/action/custom/
样式的url路由(其中
/custom/
是一个子部分,而不是一个参数)?我甚至应该期待这样做,还是我只是在反对传统?

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

如果您希望通过URL调用
用户控制器::谢谢()
,则可以选择适当的路径:

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)'));
路线是非常强大和完全灵活的蛋糕。像往常一样,学习手册:


基本要求是路由器将路由(例如
'/users/registration/:action'
)与当前URL匹配,包括第三个参数中指定的条件,例如
'action'=>'(optin | thankyou)
:action
部分必须与RegEx
/^(optin | thankyou)$//code>匹配。
如果匹配,它会将第二个参数中的默认值与从URL提取的任何信息合并,因此您可以得到
数组('controller'=>'users','action'=>'thankyou')

然后,它将其推送到
CakeRoute::parse
,它构造了在控制器中执行
debug($this->params)
时可以看到的数组。此数组用于确定要加载的控制器和要调用的操作


基本的正则表达式和参数匹配功能已经非常强大,但是您可以通过子类化
CakeRoute
并提供一个自定义
parse
函数(如本手册末尾简要说明的那样)来彻底疯狂。:)

我一直在阅读routes,然而,作为Cake的新手,许多组件之间的联系并不总是显而易见的。蛋糕在前面有很多魔力,这让我想知道当我需要跳出常规时,它到底在做什么。(我正在读烹饪书,但我只能读得这么快)@Soviut是的,这是一个相当复杂的话题,直到你明白为止。增加了一些关于魔法的解释,希望对你有所帮助。谢谢。你得到了我的选票和我的接受!我只希望蛋糕医生能告诉我做每件事的困难方法,然后告诉我之后的简单方法。先展示简单的方法往往会安抚人们,然后当他们需要做一些超出常规的事情时,他们就会陷入困境。@Soviut这是一个有趣的观点,蛋糕商可能确实存在营销问题。表面上看起来很简单,一旦你做到了,你就可以很快完成事情,这要归功于传统而非配置,因为对于新手来说,以“简单”的方式销售蛋糕确实不是个好主意。我想这也是我讨厌“Why's辛辣的Ruby指南”的原因。+1我对Cake's docs的问题(我从团队那里得到了一些狗屎,因为我这么说)是,他们通常会说明一些琐碎的情况,但没有其他选择——当然没有更复杂的。真正的项目场景很少如此琐碎。