2016-07-06 16 views
0

イメージこれは簡単なイメージです。私は '../area/England'や '../area/United%20States'のようなURLを持っています。私は '../area/england'と '../area/united-states'になりたいと思っています。Laravelクリーンリンク(スペースまたは大文字なし)

これらの領域は、私のデータベースに「England」と「United States」として保存されています。私は、それらを私が望む価値として保存することができると思っていましたが、それはURL( '英国'と '米国の国家')には良いでしょうが、ページに表示するときに元に戻す必要があります(例:「米国へようこそ!」)。とにかく私は変換を行う必要があるので、このオプションは素晴らしいものではありません。

私の質問は、 です。1.このタイプのURL操作を行うベストプラクティスは何ですか? および 2.コードはどこに記入しますか?次に、あなたのRouteServiceProvider::boot方法では、あなたが書くことができ

Route::get('/area/{country}',function(Country $country){}) 

:(strtolowerとstr_replace)

おかげ

答えて

2

はあなたのルートでhttps://laravel.com/docs/5.2/routing#route-model-binding

の "解決ロジックをカスタマイズする" のセクションをご覧ください次のようなステートメント:

$router->bind('country', function ($value) { 
    return Country::where('name', strtoupper(str_replace("-"," ",$value))->first(); 
}); 

しかし、URLスラッグを国名に変換すると、このように動作するとは限りません。あなたは確実に国名にスラグを変換する関数を記述することができない場合は、slugと呼ばれる新しいデータベース列を作成し、使用する必要があります。

$router->bind('country', function ($value) { 
    return Country::where('slug', $value)->first(); 
}); 

私はあなたにも国のリスト全体を引っ張ることができると思います一致するものが見つかるまでstr_replacestrtolowerの間で並べ替えると、毎回各国の結果がキャッシュされます。あまり効率的ではないが、私はスラグカラムを作るだろう。

+0

お返事ありがとうございます。私はルートを変更してから、あなたが提供したものをRouteServiceProviderに追加しようとしましたが、まだ間違った出力を得ています。正直言って私はRouteServiceProviderを自分で使って、なぜ動作していないのかをデバッグするのには不十分です。 – Aptorian

+0

'$ router-> bind'関数で' dd($ value) 'を実行すると、' england'または 'united-states'というURLセグメントを受け取っていることがわかります。その関数から返されるものは、 'Route :: get()'のあなたの関数が受け取るものです。 URLセグメントをモデルに変換する関数を書いているだけです。あなたが見ているものを投稿すれば、私はさらに助けてくれるかもしれません。 – Jeff

+0

こんにちは@ジェフ。私はおそらく私は私の質問をそれが可能な限り明確にしていないと思っています、そして、それは混乱がどこにあるかです。上記のコードでは、私のURLはまだ/ area/Englandです。 URLをすべて小文字にするか空白にするのではなく、データベースで大文字小文字を区別しない一致を検索しているようです。ああ、dd($ value)は 'E​​ngland'を出力します。 – Aptorian

関連する問題