php - Laravel 路由问题与 web.php 中的路由顺序

标签 php laravel-5 laravel-5.4 laravel-routing

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

相关文章:

javascript - 希望在互联网出现故障时离线存储表单数据并在互联网活跃时提交

php - 尝试将购物车中的数据插入新表时出错

php - 自定义中间件 - 重定向太多 - Laravel

php - Laravel 手动登录功能

laravel - 如果 array_diff 在 Collection->toArray() 上返回 assoc 数组,则 JSON 是对象而不是数组

php - Laravel 5 使用原始查询将结果获取到数组

php - Laravel - 无法使用 'Where' 查询过滤数据库

bash - 在 CentOS 6 中添加/更新/查找 .bashrc 或 .bash_profile 以使 Laravel 新命令正常工作

php - 需要时间戳帮助的日期

php - 即使从数据库中获取值后,在 codeigniter 3 中获取 undefined index 返回日期?