Какой самый чистый способ добавить префикс для каждого 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. Достаточно ли этого?