我在 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 的最后一条路线上,如果我将它放在下面,它就无法正常工作,但是在教程中,我们已将它移至其他路线的顶部,然后它工作正常,讲师说其中存在一些冲突路线并且最后一条路线需要位于顶部才能工作但根本没有解释为什么?任何人都可以更详细地解释一下,因为我真的刚刚开始使用 Laravel ...
最佳答案
当访问一个路由时,Laravel 会从上到下遍历您的路由列表,直到它找到一个“匹配”的路由,然后立即选择该路由。
在您的示例中,当尝试使用 GET
访问 /blog/bin
时,它有两个潜在的匹配项:
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} 下时)
)。此外,我个人认为让路由的功能取决于放置它们的顺序并不是很优雅。
在我看来,在可能的情况下,一个更稳健的解决方案是限制 /blog/{id}
接受的可能值 regex constraint .
例如,如果您的博文使用数字 ID,您知道您只想使用路由 /blog/{id}
如果 id
是数字。因此,您可以按如下方式定义路线:
Route::get('/blog/{id}', 'BlogController@show')->where('id', '[0-9]+');
当然这通常是不可能的,例如,如果您使用帖子标题作为 id
,但如果有某种方法可以区分帖子 id
任何其他 /blog/foo
路线,那么这是可能的。
关于php - Laravel 路由问题与 web.php 中的路由顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44942333/