Приезжая от Django, я используюсь, чтобы смочь организовать мои маршрутизации URL любым путем, я считаю целесообразным. Например, регистрация пользователя существовала бы под /users/
URL.
/users/
/users/registration/
/users/registration/optin/
/users/registration/thankyou/
Однако я создаю систему регистрации пользователя в CakePHP, и поведение конвенции по умолчанию для маршрутизаций URL /controller/action/
. Это уступает:
/users/
/users/registration/
/users/optin/
/users/thankyou/
Как я могу достигнуть a /controller/action/custom/
маршрутизация URL стиля на некоторых моих действиях (где /custom/
подраздел, не параметр)? Я должен даже ожидать делать это, или я просто борюсь с конвенцией?
/controller/action/custom/
по умолчанию работает нормально.
Он вызывает ControllerController::action('custom')
.
Если вам нужно что-то вроде вызова UsersController::thankyou()
через URL /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
Суть в том, что Router сопоставляет маршрут, например '/users/registration/:action'
, с текущим URL, включая условия, указанные в третьем параметре, например. например, 'action' => '(optin|thankyou)'
(часть :action
должна соответствовать RegEx /^(optin|thankyou)$/
).
Если он совпадает, он объединяет значения по умолчанию из второго параметра с любой информацией, извлеченной из URL, так что вы получаете array('controller' => 'users', 'action' => 'thankyou')
, например.
Затем он проталкивает его через CakeRoute::parse
, который создает массив, который вы можете увидеть при выполнении debug($this->params)
в контроллере. Этот массив используется для того, чтобы определить, какой контроллер загрузить и какое действие вызвать.
Базовый RegEx и сопоставление параметров уже очень мощные, но вы можете дойти до полного безумия, подклассифицировав CakeRoute
и предоставив пользовательскую функцию parse
, как это кратко объясняется в конце руководства. :)