Какой самый простой способ добавить префикс к каждому URL-адресу в CakePHP, например, языковой параметр?
http://example.com/en/controller/action
http://example.com/ru/admin/controller/action
Он должен работать с «настоящими» префиксами, такими как admin
, и в идеале голый URL-адрес /controller/action
может быть перенаправлен на /DEFAULT-LANGUAGE/controller/action
.
Теперь он работает в модифицированном приложении для меня, но это был своего рода хак, и мне нужно вручную включать языковой параметр в большинство ссылок, что нехорошо.
Так что вопрос двоякий:
- What's the best way to structure Routes, so the language parameter is implicitly included by default without having to be specified for each newly defined Route?
Router::connect('/:controller/:action/*', ...)
should implicitly include the prefix.- Параметр должен быть доступен в
$this->params['lang']
или где-то подобном для оценки вAppController::beforeFilter()
.
- How to get
Router::url()
to automatically include the prefix in the URL, if not explicitly specified?Router::url(array('controller' => 'foo', 'action' => 'bar'))
should return/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
. Будет ли этого достаточно?