Laravel Route在web.php中发布Route order

时间:2017-07-06 07:26:49

标签: 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 ......

2 个答案:

答案 0 :(得分:9)

当访问路线时,Laravel会从上到下浏览您的路线列表,直到找到符合“路线”的路线。此时立即选择此路线。

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

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} /blog/{id}接受的可能值。

例如,如果您为博客帖子使用数字ID,则您知道如果id是数字,您只想使用路由Route::get('/blog/{id}', 'BlogController@show')->where('id', '[0-9]+'); 。因此,您可以按如下方式定义路线:

id

当然,这通常不可能,例如,如果您将帖子标题用作id,但是如果有某种方法可以将帖子/blog/foo与其他activations.py区分开来}路线,那么这将是一种可能性。

答案 1 :(得分:2)

您无法在路线参数上定义类型。所以Laravel猜测你的参数可以是Integer甚至是String。

基于此,如果您尝试访问/blog/{id}。 Laravel将尝试在id参数中使用路径SELECT * FROM `chat` WHERE `chat-code` = 'vm1mxo3dpi9gzuo' AND (`user_1` = '1' OR `user_2` = '1') ORDER BY id LIMIT 3 OFFSET 5 和“bin”。

这是一个比我更好的答案:https://laracasts.com/discuss/channels/laravel/order-of-routes-being-applied/replies/149199