2016-12-16 1 views
5

В route.php я определил маршрут к контроллеру с двумя токенами на нем.URL-адрес ошибочного контроллера LARAVEL

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

Все работает отлично, пока, когда есть вызов к URL, которые имеют ту же структуру, но не имеют ничего общего с тем, что должно быть поймано этим способом, показанным ниже.

Так что если у меня есть "/admin/tags", то приведенный ниже контроллер запускается, потому что он имеет ту же структуру "/{category}/{slug}" и, конечно, он дает мне ошибку, потому что он не находит переменную.

Итак, теперь я исправил проблему перемещения этого маршрута на дно, но я считаю, что мне нужно что-то сделать, чтобы предотвратить это поведение заранее, потому что, если у меня есть несколько маршрутов с разными токенами, все будет запускаться каждый раз, и будет быть беспорядком.

Итак, что он должен делать в этих случаях?

P.S. Я супер новичок с Laravel

+0

Если у вас есть маршрут, подобный этому маршруту (например, подстановочный знак), лучше всего поместить его в нижней части маршрута. – aceraven777

ответ

2

использовать некоторое ограничение для маршрута, ссылка parameters-regular-expression-constraints. Например:

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

Или вы можете сделать наиболее конкретные до неспецифического. Например, в этой последовательности:

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

если маршрут нужно два маркера, как это, я обычно добавить префикс, так что мои маршруты выглядит так

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

или

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

I имел ту же проблему. У меня есть ограничения по каждому параметру пути (как вы всегда должны) и, к сожалению, возникает конфликт между следующими:

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]+']); 

Где даже если один путь имеет «связь /» The предваряется в пути он все еще пытался ударить другого. Помещая маршрут с добавленной «связью /» над другим маршрутом, он имеет приоритет и работает.

Лично я думаю, что если у вас есть условие, которое не встречается на маршруте, где он должен пропустить маршрут и перейти к следующему. Для меня не имеет смысла ставить условие, которое фактически не пропускается, если условия не выполняются.

Надеюсь, это поможет кому-то еще, имеющему эту проблему.