【问题标题】:Laravel routes orderLaravel 路由顺序
【发布时间】:2018-12-23 08:22:25
【问题描述】:
我在 Laravel 5 的 routes/web.php 文件中设置了一些路由,但我需要所有其他路由都使用“RouterController”。我可以使用这样的东西吗?
Route::get('/','HomeController@index');
Auth::Routes();
.
.
.
Route::get('/{slug}', 'RouterController@process');
意思是,在这种情况下,上面没有定义的每条路由都将由RouterController处理?
【问题讨论】:
标签:
laravel
laravel-5
routes
【解决方案1】:
这有点正确,这取决于。你有正确的想法。所有路由都将由@process 处理,无论它们是否已定义,具体取决于路由文件中路由的位置。
如果您想处理未定义的路由,则必须将该 /{slug} 路由放在路由文件的最底部。这样,Laravel 将首先查看路由输入是否已定义,并提供该路由。如果不是,那么它最终会进入 /{slug}
不过,我不建议使用这种方法,老实说,这似乎是一种不好的做法。我认为您最好为 resources/views/errors/404.blade.php 创建一个视图,这样如果路由未定义,则由 404 错误处理。
【解决方案2】:
当然,您正在制定一条包罗万象的路线。您所拥有的唯一问题是它只会匹配具有单个段的路线:
yoursite.com/anything
但它会错过任何超过 1 段的内容:
yoursite.com/anything/else/....
如果你想捕获所有你需要一个 lil 正则表达式来限制路由参数slug 的条件:
Route::get('{slug}', 'RouterController@process)->where('slug', '.*');
现在该路由将捕获任何 URL。
路由器上还有一个fallback 方法会根据你的条件设置这条路由:
Route::fallback('yourAction');
【解决方案3】:
你认为是对的。 Laravel 从上到下检查您在web.php 中定义的路线,因此每次您输入的路线在您在最后一条路线上方定义的路线中不存在时,输入的路线slug 将被传递给RouterController 中的 process() 函数,你可以将你的逻辑添加到这个函数中来做你想做的事情。