Как создать собственные маршруты для определенных действий в контроллере CakePHP? - PullRequest
1 голос
/ 29 июля 2010

Исходя из 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/ style-url для некоторых моих действий (где /custom/ это подраздел, а не параметр)?Должен ли я вообще ожидать этого или я просто сражаюсь на конвенции?

1 Ответ

2 голосов
/ 29 июля 2010

/controller/action/custom/ отлично работает по умолчанию.
Он вызывает ControllerController::action('custom').

Если вы ищете что-то вроде вызова UsersController::thankyou() через URL /users/registration/thankyou, вы можете сделать соответствующийroute:

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) в контроллере.Этот массив используется для определения того, какой контроллер загружать и какое действие вызывать.

Базовый RegEx и сопоставление параметров уже очень мощные, но вы можете полностью сойти с ума, подклассифицировав CakeRoute и предоставив пользовательский parse функция, как кратко объяснено в конце руководства.:)

...