Laravel Route在web.php中发布Route order

Igo*_*nja 4 php laravel-routing laravel-5 laravel-5.4

我在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');
Run Code Online (Sandbox Code Playgroud)

问题是在博客/ bin的最后一条路线中,如果我把它保持在下面,它就无法工作但是在教程中我们将它移到其他路线的顶部,然后它工作正常,讲师说路线中存在一些冲突为了工作,最后一条路线需要在顶部但是根本没有解释为什么?任何人都可以解释一下细节,因为我刚刚开始使用Laravel ......

Rad*_*cal 10

当访问路线时,Laravel会从上到下浏览您的路线列表,直到找到"匹配"的路线,此时此路线会立即被选中.

在您的示例中,当尝试/blog/bin使用时GET,它有两个可能的匹配:

Route::get('/blog/{id}', 'BlogController@show');
Run Code Online (Sandbox Code Playgroud)

Route::get('/blog/bin', 'BlogController@bin');
Run Code Online (Sandbox Code Playgroud)

在这种情况下,Route::get('/blog/{id}', 'BlogController@show');首先是它将被选中.

正如先前的答案正确陈述,将/blog/bin路线放置在路线上方/blog/{id}将解决问题.但是,这种"解决方案"会让您在将来遇到类似的错误(例如,定义/blog/example路线并意外地将其置于其下/blog/{id}).另外,我个人认为你的路线功能取决于它们的顺序是不是很优雅.

在我看来,如果可能的话,一个更强大的解决方案是限制由接受可能的值/blog/{id}正则表达式约束.

例如,如果您为博客帖子使用数字ID,则您知道/blog/{id}如果id是数字,则只想使用路由.因此,您将按如下方式定义路线:

Route::get('/blog/{id}', 'BlogController@show')->where('id', '[0-9]+');
Run Code Online (Sandbox Code Playgroud)

当然,这通常是不可能的,例如,如果你使用帖子标题作为id,但如果有某种方法来区分帖子id与任何其他/blog/foo路线,那么这将是一种可能性.