Ich habe ein einfaches Routing-Setup für verschiedene Sprachen. Das Ziel ist, die Sprache als ersten Parameter in der URL wie /en/docs
oder /de/docs
zu haben. Die Sprachdefinitionen werden als scopes
als Erscheinen eingestellt unter:CakePHP 3: Wechsel zwischen den Routern
$builder = function ($routes)
{
$routes->connect('/:controller', ['action' => 'index']);
$routes->connect('/:controller/:action/*', ['action' => 'index']);
};
$languages = ['en', 'de'];
foreach ($languages as $lang) {
Router::scope('/'.$lang, ['language' => $lang], $builder);
}
Router::addUrlFilter(function ($params, $request) {
if ($request->param('language')) {
$params['language'] = $request->param('language');
}
else {
$params['language'] = 'en';
}
return $params;
});
Jeder der Bereiche wie erwartet funktioniert. Selbst mit komplexeren Verbindungen und Präfixen (ich entfernte sie aus dem obigen Code, um den Code lesbarer zu machen).
Das Problem ist jetzt: Wie erstellt man einen Link, um zwischen den Sprachen (Bereiche) zu wechseln?
Ich habe versucht, verschiedene URLs, aber abhängig von der aktuellen URL (zB /de/docs
), die Sprachparameter hat keine Auswirkung auf die erstellt Urls:
Router::url(['language' => 'en', 'controller' => 'docs']);
// -> /de/docs (expected: /en/docs)
Router::url(['language' => 'de', 'controller' => 'docs']);
// -> /de/docs
Wie die Routen beheben die erwartete zu erhalten URLs?