¿Cuál es la forma más limpia de agregar un prefijo a cada URL en CakePHP, como un parámetro de idioma?Agregar un prefijo a cada URL en CakePHP
http://example.com/en/controller/action
http://example.com/ru/admin/controller/action
Se necesita trabajar con los prefijos "reales" como admin
, e idealmente la URL desnuda /controller/action
podría ser redirigido a /DEFAULT-LANGUAGE/controller/action
.
Ahora estoy trabajando en una aplicación retroadaptada, pero fue un truco, y necesito incluir el parámetro de idioma a mano en la mayoría de los enlaces, lo cual no es bueno.
Así que la pregunta es doble:
- Cuál es la mejor manera de estructurar las rutas, por lo que el parámetro de idioma se incluye implícitamente por defecto sin tener que ser especificado para cada ruta que acaba de definir?
Router::connect('/:controller/:action/*', ...)
debe incluir implícitamente el prefijo.- El parámetro debe estar disponible en
$this->params['lang']
o en algún lugar similar para ser evaluado enAppController::beforeFilter()
.
- ¿Cómo obtener
Router::url()
para incluir automáticamente el prefijo en la URL, si no se especifica explícitamente?Router::url(array('controller' => 'foo', 'action' => 'bar'))
deberían volver/en/foo/bar
- Desde
Controller::redirect()
,Form::create()
o inclusoRouter::url()
necesita directamente a tener el mismo comportamiento, ignorando cada función no es realmente una opción.Html::image()
, por ejemplo, debería producir una URL sin prefijo.
Los siguientes métodos parecen llamar Router::url
.
Controller::redirect
Controller::flash
Dispatcher::__extractParams
travésObject::requestAction
Helper::url
JsHelper::load_
JsHelper::redirect_
View::uuid
, pero sólo para una generación de hash
De los que parece que los métodos Controller y Helper tendrían que ser anulados, podría vivir sin el JsHelper
. Mi idea sería escribir una función general en AppController
o tal vez solo en bootstrap.php
para manejar la inserción de parámetros. Los métodos reemplazados de Controller y Helper usarían esta función, como lo haría si quisiera llamar manualmente al Router::url
. ¿Esto sería suficiente?
Y de acuerdo con los comentarios, reemplazando 'AppController :: url' lo haría por los controladores. Hasta aquí todo bien, ¿hay algo más? ¿Las otras partes llaman 'Router :: url' directamente? – deceze