2017-06-18 12 views
1

多言語アプリケーションを開発しており、URLに経路{locale}プレフィックスを渡すミドルウェアを作ろうとしています。しかし、今、私は、たとえば、コントローラにこの{}ロケールパラメータを使用する必要はありません。Laravel 5.4:コントローラで経路パラメータを使用しないでください

public function getPost(App\Post $post) 
{ 
    return view('welcome')->withPost($post); 
} 

しかし、私は$locale, App\Post $postApp\Post $postを変更しない限り、上記のコードは動作しません。

問題は、新しいコントローラを作成するたびに$ localeパラメータを渡す必要があるためです。それはクールではない。

$localeパラメータをすべてのコントローラに渡すことを避けるにはどうすればよいですか?私はミドルウェアですでにそれを使用していたので、私はそれを必要としません。

UPDATE:それが必要とされない場合

ルート\ web.php

Route::prefix('{locale}')->middleware('locale')->group(function() {  

    Route::get('/', '[email protected]')->name('welcome'); 
    Auth::routes(); 
    Route::get('/home', '[email protected]')->name('home'); 

    ... 

    // This route must be the last! 
    Route::get('/{post}', '[email protected]')->name('post'); 
}); 

答えて

0

のための別のルートパラメータを期待しています。

これにより、{locale}プレフィックスパラメータを解析するためのミドルウェアは必要ありません。 URLからロケールを解析するために、私のカスタムヘルパー関数を参照してください:

function parseLocale() 
{ 
    $locale = Request::segment(1); 
    $languages = ['pt', 'it', 'fr', 'ru', 'es']; 

    if (in_array($locale, $languages)) { 
     App::setLocale($locale); 
     return $locale; 
    } 

    return '/'; 
} 

今、私はちょうど私のルートでそれを使用する必要があります::プレフィックス()次のように:

Route::prefix(parseLocale())->group(function() { 
    Auth::routes(); 
    Route::get('home', '[email protected]')->name('home'); 
    Route::get('/', '[email protected]')->name('welcome'); 
    ... 

をあなたが見ることができるように、あなたの場合www.site.com/pt/somethingに移動しようとすると、somethingの経路はwww.site.com/somethingにナビゲートするのと同じ方法で行われます。しかし、ロケールプレフィックスがなければ、Laravelはあなたがconfig\app.phpに設定したデフォルト言語を読み込みます。

ありがとう!

0

は、あなたのルートパラメーターから{locale}を削除します。あなたはそこにそこに定義されたルートをまだ持っているように思えます。確認できるようにroutes/web.phpを投稿してください。あなたのルートが同じように定義されている場合は

Route::get('/{locale}/{post}', '[email protected]'); 

Laravelは、2つのパラメータを期待して最初の1のための場所にあるものと結合します。したがって、たとえば、'/some-post'{locale}'some-post'を結合するであろうし、まだ{post}私はprefixパラメータを使用しますが、カスタムヘルパー関数を使用せずに私の質問を解決

+0

更新しました。ご覧のとおり、すべてのルートに{locale}プレフィックスを使用しています。 'locale'パラメータをオプションのままにする方法はありますか?私は 'www.site.com/fr/about'と' www.site.com/about'にナビゲートする必要があります。 'locale'パラメータを渡さないと、デフォルトで英語が読み込まれます。 –

+0

私が知る限りでは、URLがあいまいになり、ルータはURLの途中でオプションのパラメータを区別できません。 '{locale}'がリストの最後のパラメータだった場合は、それをオプションでマークすることができますが、適切な構造体でマークすることはできません。 – btl

+0

うん!だから...ここで質問を解決するにはどこに行く?別の方法/構造/アルゴリズムがあれば、私は感謝します。 –

関連する問題