Как создать пользовательские маршруты для определенных действий в контроллере CakePHP?

Приезжая от 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/ подраздел, не параметр)? Я должен даже ожидать делать это, или я просто борюсь с конвенцией?

1
задан Soviut 29 July 2010 в 05:05
поделиться

1 ответ

/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, как это кратко объясняется в конце руководства. :)

2
ответ дан 2 September 2019 в 22:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: