Was ist der sauberste Weg, um jeder URL in CakePHP ein Präfix hinzuzufügen, wie ein Sprachparameter?Hinzufügen eines Präfixes zu jeder URL in CakePHP
http://example.com/en/controller/action
http://example.com/ru/admin/controller/action
Es muss mit „echten“ Präfixen wie admin
und idealerweise die bloße URL zu /DEFAULT-LANGUAGE/controller/action
/controller/action
könnte umgeleitet werden arbeiten.
Es funktioniert jetzt in einer Retro-angepassten Anwendung, aber es war eine Art Hack, und ich muss den Sprachparameter von Hand in die meisten Links einfügen, was nicht gut ist.
Die Frage ist also eine doppelte:
- Was ist der beste Weg, die Routen zu strukturieren, so dass die Sprachparameter implizit standardmäßig enthalten, ohne für jede neu definierte Strecke angegeben werden muss?
Router::connect('/:controller/:action/*', ...)
sollte implizit das Präfix enthalten.- Der Parameter sollte in
$this->params['lang']
oder irgendwo ähnlich sein, um inAppController::beforeFilter()
ausgewertet zu werden. - Wie erhalten
Router::url()
automatisch das Präfix in der URL enthalten, wenn nicht explizit angegeben?Router::url(array('controller' => 'foo', 'action' => 'bar'))
sollte/en/foo/bar
- Seit
Controller::redirect()
zurückkehren,Form::create()
oder sogarRouter::url()
direkt das gleiche Verhalten haben müssen, jede einzelne Funktion ist nicht wirklich eine Option überschrieben wird.Html::image()
sollte beispielsweise eine URL ohne Präfix erzeugen.
Die folgenden Methoden scheinen Router::url
zu nennen.
Controller::redirect
Controller::flash
Dispatcher::__extractParams
überObject::requestAction
Helper::url
JsHelper::load_
JsHelper::redirect_
View::uuid
, aber nur für einen Hash-Erzeugungs
Aus diesen scheint die Controller und Helper-Methoden überschrieben werden müssen, könnte ich ohne die JsHelper
leben. Meine Idee wäre, eine allgemeine Funktion in oder vielleicht nur in bootstrap.php
schreiben, um die Parametereinfügung zu behandeln. Die überschriebenen Controller- und Helper-Methoden würden diese Funktion verwenden, genau wie ich, wenn ich Router::url
manuell aufrufen möchte. Wäre das ausreichend?
Und nach den Kommentaren würde das Überschreiben von 'AppController :: url' es für Controller tun. So weit, so gut, gibt es noch etwas? Rufen andere Teile 'Router :: url' direkt an? – deceze