2017-10-08 1 views
0

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?

Antwort

0

Ich habe den Grund für dieses Verhalten gefunden. Die Funktion addUrlFilter ersetzte den Sprachenparameter beim Generieren der URLs und das Ergebnis war immer die aktuelle Sprache. Eine aktualisierte Version dieser Funktion hat den Zweck erfüllt:

Router::addUrlFilter(function ($params, $request) { 
    if (!isset($params['language'])) { 
    $params['language'] = $request->param('language'); 
    } 
    return $params; 
}); 

Puuh, 1 Stunde des Suchens und versuchen ...