我在Laravel中遇到路由问题,我正在关注一个教程,我们在web.php文件中列出了此路由
Route::get('/home', 'HomeController@index')->name('home');
Route::get('/blog', 'BlogController@index')->name('blog');
Route::get('/blog/create', 'BlogController@create');
Route::post('/blog/store', 'BlogController@store');
Route::get('/blog/{id}', 'BlogController@show');
Route::get('/blog/{id}/edit', 'BlogController@edit');
Route::patch('/blog/{id}', 'BlogController@update');
Route::delete('/blog/{id}', 'BlogController@destroy');
Route::get('/blog/bin', 'BlogController@bin');
问题是到Blog/bin的最后一条路线,如果我将其保持在下面,它将不起作用,但是在教程中,我们将其移至其他路线的顶部,然后工作正常,讲师说 route 存在一些冲突,并且为了工作,最后一条路线必须位于最顶部,但是根本没有解释为什么?任何人都可以解释更多细节,因为我真的刚开始使用Laravel ...
最佳答案
当访问一条路线时,Laravel会从上到下浏览您的路线列表,直到找到一个“匹配”的路线,然后立即选择该路线。
在您的示例中,当尝试使用/blog/bin
访问GET
时,它具有两个潜在的匹配项:
Route::get('/blog/{id}', 'BlogController@show');
和
Route::get('/blog/bin', 'BlogController@bin');
在这种情况下,
Route::get('/blog/{id}', 'BlogController@show');
首先出现,因此将其选中。正如前面的答案正确指出的那样,将
/blog/bin
路由置于/blog/{id}
路由之上将解决此问题。但是,这种“解决方案”会让您在将来遇到类似的错误(例如,当定义/blog/example
路线并将其意外地放置在/blog/{id}
下时)。此外,我个人认为,根据路线的放置顺序来决定路线的功能并不是一件很优雅的事情。我认为,在可能的情况下,更可靠的解决方案是使用regex constraint限制
/blog/{id}
接受的可能值。例如,如果您在博客文章中使用数字ID,则您知道仅在
/blog/{id}
是数字的情况下才想使用路由id
。因此,您将如下定义路线:Route::get('/blog/{id}', 'BlogController@show')->where('id', '[0-9]+');
当然,这通常是不可能的,例如,如果您将帖子标题用作
id
,但是如果有某种方法可以将post id
与任何其他/blog/foo
路线区分开,那么这将是可能的。关于php - Laravel路线问题与web.php中的路线顺序有关,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44942333/