2016-12-16 48 views
5

W rout.php zdefiniowałem trasę do kontrolera z 2 tokenami.URL trafił w złego kontrolera LARAVEL

Route::get('/{category}/{slug}', '[email protected]'); 

Wszystko działa bez zarzutu, aż gdy nie ma połączenia do adresu URL, które mają taką samą strukturę, ale nie ma nic wspólnego z tym, że musi być objęte tą trasą pokazaną poniżej.

Więc kiedy mam na przykład "/admin/tags", poniżej kontroler jest wyzwalany, ponieważ ma taką samą strukturę "/{category}/{slug}" i oczywiście daje mi błąd, ponieważ nie znajdzie zmienną.

Rozwiązałem teraz problem przesuwania tej trasy na dół, ale uważam, że muszę zrobić coś, aby zapobiec temu postępowaniu z góry, ponieważ jeśli mam wiele tras z różnymi tokenami, wszystko będzie uruchamiane za każdym razem i będzie być bałaganem.

Co zatem należy zrobić w takich przypadkach?

P.S. Jestem super początkującym z Laravelem

+0

Jeśli masz taką trasę (jak na przykład trasa wieloznaczna), najlepiej zawsze umieszczać ją na samym dole trasy. – aceraven777

Odpowiedz

2

użyć jakiegoś ograniczenia na trasie, odnośnik parameters-regular-expression-constraints. Na przykład:

Route::get('user/{name}', function ($name) { 
    // 
}) 
->where('name', '[A-Za-z]+'); 

Lub możesz zrobić najbardziej szczegółowe przed niespecyficzne. Na przykład, w tej kolejności:

Route::get("/admin/tags", '......'); 
Route::get('/{category}/{slug}', '[email protected]'); 
1

jeśli trasa potrzeba dwóch żeton takiego, Jestem zazwyczaj dodać przedrostek tak moje drogi wygląda to

Route::get('/categories/{category}/slug/{slug}', '[email protected]'); 

lub

Route::get('/categories/{category}/{slug}', '[email protected]'); 
0

I miał ten sam problem. mam ograniczenia na każdego parametru ścieżki (jak zawsze powinny) i niestety występuje konflikt między:

Route::get('{userId}/{path}', [ 
    'as' => 'products', 
    'uses' => '[email protected]' 
])->where(['id' => '[0-9]+', 'path' => '[0-9a-fA-F]+']); 

Route::get('link/{link_path}', [ 
    'as' => 'product-link', 
    'uses' => '[email protected]' 
])->where(['link_path' => '[0-9a-fA-F]+']); 

Jeżeli chociaż jedna ścieżka ma „Link /” The poprzedzany w ścieżce nadal próbował uderzyć w drugiego. Poprzez umieszczenie trasy z uprzednio ustawionym "linkiem /" nad drugą trasą miała priorytet i działa.

Osobiście myślę, że jeśli masz warunek, który nie jest spełniony na trasie, gdzie klauzula powinna pomijać trasę i przejść do następnej. To naprawdę nie ma sensu, aby umieścić warunkowe, które faktycznie nie zostaną przekazane, jeśli warunki nie zostaną spełnione.

Mam nadzieję, że to pomoże każdemu, kto ma ten problem.