2016-07-02 6 views
0

Ich baue ein Projekt mit Laravel 5.2 und in routes.php Datei habe ich die nächsten 2 Routen:Laravel: Einige Routen funktioniert nicht, wenn es in der `routes.php` Datei nach einem anderen Weg kommt

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

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

In dieser Reihenfolge funktioniert die erste Route products.show gut und wie erwartet, aber die zweite Route products.search nicht, es gibt eine leere Webseite anstelle der erwarteten Suchergebnisse.

Ich habe versucht, das Problem zu beheben, indem Sie ihre Bestellungen ändern und die products.search Route vor der products.show Route platzieren, und als ich das tat, hat es gut und wie erwartet funktioniert.

Also, was ist los? Und warum passiert das?

PS: Eine andere Lösung war die nächste Regel am Anfang der route.php Datei zu platzieren:

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

Und wenn ich diese Regel hinzugefügt, arbeiteten beide Routen finden, und es spielt keine Rolle, was kommt zuerst. Was aber, wenn ich diese Regel nicht hinzufüge?

Antwort

4

Das Routing-System stoppt, sobald eine Übereinstimmung gefunden wird. Also lassen Sie uns sagen, Sie haben diese drei:

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

Nun gehen Sie zu /products/someroute. Nur der erste wird ausgelöst, und die beiden folgenden werden niemals aktiviert.

Ihre Mustereinschränkung bedeutet, dass wenn Sie zu /products/search gehen, die erste nicht ausgelöst wird, da sie nach einer numerischen {id} Variable sucht.

Ohne diese Einschränkung könnte {id} alles sein - wie die Zeichenfolge search zum Beispiel. Also dann, dann wird die zweite Route nicht ausgelöst. Sie müssen also die Reihenfolge ändern, damit es funktioniert.

Sie können auch Routenmodellbindung verwenden, die Sie hier lesen können: https://laravel.com/docs/5.2/routing#route-model-binding