我在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/

10-11 22:16
查看更多