Hinzufügen eines Präfixes zu jeder URL in CakePHP
Was ist der sauberste Weg, um jeder URL in CakePHP ein Präfix wie einen Sprachparameter hinzuzufügen?
http://example.com/en/controller/action
http://example.com/ru/admin/controller/action
Es muss mit "echten" Präfixen wie funktionierenadmin
und im Idealfall die nackte URL/controller/action
könnte umgeleitet werden/DEFAULT-LANGUAGE/controller/action
.
Für mich funktioniert es jetzt in einer nachgerüsteten Anwendung, aber es war eine Art Hack, und ich muss die Sprachparameter in den meisten Links von Hand einfügen, was nicht gut ist.
Die Frage ist also zweifach:
Wie lassen sich Routen am besten strukturieren, sodass der Sprachparameter standardmäßig implizit enthalten ist, ohne dass er für jede neu definierte Route angegeben werden muss?Router::connect('/:controller/:action/*', ...)
sollte implizit das Präfix enthalten.Der Parameter sollte in verfügbar sein$this->params['lang']
oder irgendwo ähnlich in ausgewertet werdenAppController::beforeFilter()
.Wie kommt manRouter::url()
automatisch das Präfix in die URL aufnehmen, wenn nicht explizit angegeben?Router::url(array('controller' => 'foo', 'action' => 'bar'))
sollte zurückkehren/en/foo/bar
Schon seitController::redirect()
, Form::create()
oder auchRouter::url()
direkt das gleiche Verhalten haben müssen, ist das Überschreiben jeder einzelnen Funktion nicht wirklich eine Option.Html::image()
Zum Beispiel sollte eine URL ohne Präfix erstellt werden.Die folgenden Methoden scheinen aufzurufenRouter::url
.
Controller::redirect
Controller::flash
Dispatcher::__extractParams
überObject::requestAction
Helper::url
JsHelper::load_
JsHelper::redirect_
View::uuid
, aber nur für eine Hash-GenerationVon diesen scheint es, dass die Controller- und Helper-Methoden außer Kraft gesetzt werden müssten, ich könnte ohne die lebenJsHelper
. Meine Idee wäre, eine allgemeine Funktion in zu schreibenAppController
oder vielleicht nur inbootstrap.php
um das Einfügen von Parametern zu handhaben. Die überschriebenen Controller- und Helper-Methoden würden diese Funktion verwenden, ebenso wie ich, wenn ich manuell aufrufen wollteRouter::url
. Wäre das ausreichend?