2017-10-08 64 views
0

我有一個簡單的路由設置來處理不同的語言。目標是將語言作爲/en/docs/de/docs之類的網址中的第一個參數。CakePHP 3:在路由器作用域之間切換

$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; 
}); 

各領域的工作正常:語言定義設置爲scopes,如下所示。即使有一些更復雜的連接和前綴(我將它們從上面的代碼中移除以使代碼更易讀)。

現在的問題是:如何創建一個鏈接來切換語言(範圍)?

我嘗試不同的網址,但根據當前的URL(如/de/docs),語言參數不具有對創建網址的任何影響:

Router::url(['language' => 'en', 'controller' => 'docs']); 
// -> /de/docs (expected: /en/docs) 
Router::url(['language' => 'de', 'controller' => 'docs']); 
// -> /de/docs 

如何解決途徑,以獲得預期網址嗎?

回答

0

我找到了這種行爲的原因。在生成url時,函數addUrlFilter替換了語言參數,結果始終是當前語言。此功能的更新版本做這項工作:

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

Puuh,搜索一小時,並試圖...