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 路由排序的主要内容,如果未能解决你的问题,请参考以下文章