2017-10-08 3 views
0

私は、異なる言語に対応する簡単なルーティング設定をしています。目的は、言語の最初のパラメータとして、/en/docsまたは/de/docsのようなURLを持つことです。予想通りスコープのそれぞれが取り組んでいる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を試してみましたが、現在のURL(例えば/de/docs)に応じて、言語パラメータが作成されたURLには影響しません。

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

予想を取得するためにルートを修正する方法URL?

答えて

0

この現象の原因が見つかりました。 URLを生成するときに関数addUrlFilterがlanguageパラメータを置き換え、結果は常に現在の言語でした。 ...

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

Puuh、検索の一時間としよう:この機能の更新バージョンは、仕事をしていません