Laravel web.php中的路线订单问题

jum4pzuy  于 2023-01-19  发布在  PHP
关注(0)|答案(2)|浏览(138)

我在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');

问题是在最后一个路径到博客/斌,它是不工作的,如果我把它放在下面,但在教程中,我们已经把它移到其他路线的顶部,然后它的工作很好,教师说,有一些冲突的路线,最后一个路线需要在顶部才能工作,但没有解释为什么?有人能解释在一点更详细的,因为我才刚开始学拉拉威尔。

juud5qan

juud5qan1#

当访问一条路线时,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}接受的可能值。
例如,如果您的博客文章使用数字ID,您知道只有当id是数字时才需要使用路由/blog/{id},因此,您可以按如下方式定义路由:

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

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

r6l8ljro

r6l8ljro2#

你不能定义一个路由参数的类型,所以Laravel猜测你的参数可以是一个整型或者字符串。
基于此,如果您尝试访问/blog/bin . Laravel将尝试使用id param中带有“bin”的路由/blog/{id}
这里有一个比我更好的答案:https://laracasts.com/discuss/channels/laravel/order-of-routes-being-applied

相关问题