2016-07-02 10 views
0

私はLaravel 5.2でプロジェクトを構築しています中に別のルートの後に来る場合、一部の路線では動作しません、とroutes.phpファイルに私は次の2つのルートがあります。Laravel:それは `routes.php`ファイル

Route::get("/products/{id}", [ 
    "as" => "products.show", 
    "uses" => "[email protected]", 
]); 

Route::get("/products/search", [ 
    "as" => "products.search", 
    "uses" => "[email protected]", 
]); 

この順番で、最初のルートproducts.showは正常に動作しますが、2番目のルートproducts.searchは期待した検索結果の代わりに空白のWebページを表示します。

products.showルートの前に注文を変更してproducts.searchルートを配置することで問題を解決しようとしましたが、それを実行したときに正常に動作しました。

だから間違っていますか?それはなぜ起こるのですか?

PS:もう一つの解決策は、route.phpファイルの先頭に次のルールを配置することでした:

Route::pattern("id", "[0-9]+"); 

そして、私はこのルールを追加したとき、両方のルートを見つけるに働いて、来るかは重要ではありません最初。しかし、もし私がこのルールを追加しなかったら?

答えて

4

ルーティングシステムは、一致するとすぐに停止します。それでは、あなたはこれらの3を持っているとしましょう:

Route::get("/products/{variableA}" // ... 
Route::get("/products/{variableB}" // ... 
Route::get("/products/{variableC}" // ... 

今、あなたが/products/somerouteに行きます。最初のものだけが誘発し、次の2つのものは決して活性化しません。

パターンの制約は、/products/searchに行くと、数字の{id}変数を探しているため、最初のパターンがトリガーされないことを意味します。

この制約がない場合、{id}は、たとえば文字列searchのようになります。それでは、2番目のルートがトリガーされません。そのためには逆順に並べる必要があります。

また、ここで読むことができるルートモデルバインディングを使用することもできます。https://laravel.com/docs/5.2/routing#route-model-binding

関連する問題