Laravel 路由排序

Posted

技术标签:

【中文标题】Laravel 路由排序【英文标题】:Laravel Routes ordering 【发布时间】:2016-01-17 15:49:00 【问题描述】:

我在一个项目中使用 Laravel 4.2。

我已经设置了路线:

标签、类别、服务

在排序方面,如果我将服务移动到 slug 之上,它找不到 slug 并最终转到服务控制器,同样,如果我将 slug 方法保留在服务之上。它也找不到。

我目前的路线如下:

Route::get('slug?', 'HomeController@index');
Route::get('category?', 'HomeController@category');
Route::get('services?', 'ServicesController@index');

有没有办法解决这个问题,第一类工作正常,但是切换 slug 和服务会产生问题。

谢谢

【问题讨论】:

这可能是因为你的路线理论上都是一样的,你不能做/category/category/services/service之类的事情。只是为了测试?请记住,我是 laravel 的新手,哈哈 刚刚尝试过@AndyHolmes 的服务无法正常工作。它正在被路由到 slug 路由 您还必须将最具体的路线放在第一位,否则将应用更通用的路线,因为slug? 几乎适用于您通过的任何路线。 【参考方案1】:

按照你编写路由的方式,Laravel 无法判断哪个请求应该转到哪个路由,因为你编写了三个路由,其中​​一个可选参数可以是任何参数。 路由的工作方式是:它应用与模式匹配的第一条路由。这就是为什么当它遇到第一个显示“一个参数可以是任何东西”的路由模式时,它会选择该路由。

你应该给 Laravel 一些提示,比如:

Route::get('slug?', 'HomeController@index')->where('slug', '(blog|home|contact)');

Route::get('/category/category?', 'HomeController@category');

Route::get('/services/services?', 'ServicesController@index');

如果你限制了可能的值或者你在 URL 中添加了额外的部分,Laravel 将能够识别哪个路由应该去哪个处理程序。

看看docs以获得更多想法

【讨论】:

谢谢!蛞蝓和类别的工作,但服务之一仍然不起作用。我试过 ->where('slug', '[A-Za-z]+');但没有运气! [A-Za-z]+ 表示 slug 有任何大写或小写字母并且最小长度为 1。 那么我如何获得任何 URL 限制类别和服务。去 HomeController@index 文档的不幸没有帮助。 您应该将最通用的路由放在最后(在本例中为slug)或使用where 语句限制值。但请记住,任何与它上面的路线不匹配的东西,它都会回退到它,因为它实际上意味着任何是一串字母 把它作为你路线的最后一个,因为你希望它是通用的。请记住,Laravel 会应用第一个匹配的模式。

以上是关于Laravel 路由排序的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 无刷新重新排序+控制显示隐藏

Laravel 重定向到一个路由,但是 apache 给出 404 错误

laravel 路由参数的默认值怎么设置

【PHP】laravel中获取当前路由名称

laravel5.4学习--laravel基本路由

Laravel反向路由的好处