Какой самый чистый способ добавить префикс для каждого URL-адреса в CakePHP, например параметр языка?
http://example.com/en/controller/action
http://example.com/ru/admin/controller/action
Он должен работать с "настоящими" префиксами, такими как admin
, и в идеале голый URL /controller/action
можно перенаправить на /DEFAULT-LANGUAGE/controller/action
.
Теперь он работает в ретро-приложении для меня, но это был своего рода хак, и мне нужно включить параметр языка вручную в большинстве ссылок, что не очень хорошо.
Итак, вопрос двоякий:
- Каков наилучший способ структурирования маршрутов, поэтому параметр языка неявно включается по умолчанию без необходимости указывать для каждого вновь определенного маршрута?
-
Router::connect('/:controller/:action/*', ...)
должен неявно включать префикс. - Параметр должен быть доступен в
$this->params['lang']
или где-то аналогично, чтобы быть оцененным вAppController::beforeFilter()
.
-
- Как получить
Router::url()
для автоматического включения префикса в URL-адрес, если он явно не указан?-
Router::url(array('controller' => 'foo', 'action' => 'bar'))
должен возвращать/en/foo/bar
- Так как
Controller::redirect()
,Form::create()
или дажеRouter::url()
напрямую необходимо иметь одинаковое поведение, переопределение каждой отдельной функции на самом деле не является опцией.Html::image()
, например, должен содержать URL без префикса.
-
Следующие методы, похоже, вызывают Router::url
.
-
Controller::redirect
-
Controller::flash
-
Dispatcher::__extractParams
черезObject::requestAction
-
Helper::url
-
JsHelper::load_
-
JsHelper::redirect_
-
View::uuid
, но только для генерации хешей
Из них кажется, что методы Controller и Helper необходимо переопределить, я мог бы жить без JsHelper
. Моя идея состояла бы в том, чтобы написать общую функцию в AppController
или, возможно, только в bootstrap.php
для обработки вставки параметров. Переопределенные методы Controller и Helper будут использовать эту функцию, как если бы я захотел вручную вызвать Router::url
. Достаточно ли этого?