我在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');
问题是在最后一个路径到博客/斌,它是不工作的,如果我把它放在下面,但在教程中,我们已经把它移到其他路线的顶部,然后它的工作很好,教师说,有一些冲突的路线,最后一个路线需要在顶部才能工作,但没有解释为什么?有人能解释在一点更详细的,因为我才刚开始学拉拉威尔。
2条答案
按热度按时间juud5qan1#
当访问一条路线时,Laravel会从上到下浏览您的路线列表,直到找到一条“匹配”的路线,此时该路线将立即被选中。
在您的示例中,当尝试使用
GET
访问/blog/bin
时,它有两个可能的匹配项:以及
在本例中,
Route::get('/blog/{id}', 'BlogController@show');
排在前面,因此将被选中。正如前面正确回答的那样,将
/blog/bin
路由放在/blog/{id}
路由之上可以解决问题。(例如,当定义/blog/example
路由并意外地将其放置在/blog/{id}
下时)。此外,我个人认为,让你的路线的功能取决于放置它们的顺序是不是很优雅的。在我看来,如果可能的话,一个更健壮的解决方案是用正则表达式约束来 * 限制 *
/blog/{id}
接受的可能值。例如,如果您的博客文章使用数字ID,您知道只有当
id
是数字时才需要使用路由/blog/{id}
,因此,您可以按如下方式定义路由:当然,这通常是不可能的,例如,如果你使用文章标题作为
id
,但如果有某种方法来区分文章id
从任何其他/blog/foo
路线,那么这将是一种可能性。r6l8ljro2#
你不能定义一个路由参数的类型,所以Laravel猜测你的参数可以是一个整型或者字符串。
基于此,如果您尝试访问
/blog/bin
. Laravel将尝试使用id param中带有“bin”的路由/blog/{id}
。这里有一个比我更好的答案:https://laracasts.com/discuss/channels/laravel/order-of-routes-being-applied