Laravel 5.1如何在嵌套路由组中排除单个路由的auth中间件?
解决Laravel 5.1中排除指定路由auth中间件的问题
我之前也碰到过类似的路由中间件继承问题,给你两个实用的解决方案,应该能搞定你的困扰:
方案一:在原路由组内移除指定路由的auth中间件
Laravel 5.1已经支持用withoutMiddleware()方法单独移除某个路由的继承中间件,这样你不用改动路由结构,直接在子组里给目标路由去掉auth保护就行:
Route::group(['middleware' => 'auth'], function () { // 其他需要auth验证的路由... Route::group(['namespace' => 'Lawyer'], function() { // 给UrlProfile对应的路由移除auth中间件 Route::get('profile/{slug}', 'UrlProfileController@show') ->withoutMiddleware('auth'); // Lawyer命名空间下其他需要auth保护的路由... }); });
这种方式的好处是不用调整路由结构,直接针对单个路由取消中间件继承,非常直观。
方案二:将路由移出父组,确保路由优先级和命名空间正确
你说移出父组后不生效,大概率是两个原因:路由匹配优先级问题或者命名空间配置错误,按下面的方式写就没问题:
// 先定义不需要auth的路由——Laravel路由是从上到下匹配的,要让无auth的路由先被匹配 Route::group(['namespace' => 'Lawyer'], function() { Route::get('profile/{slug}', 'UrlProfileController@show'); }); // 再定义带auth中间件的父路由组 Route::group(['middleware' => 'auth'], function () { // 其他需要auth验证的路由... Route::group(['namespace' => 'Lawyer'], function() { // Lawyer命名空间下其他需要auth保护的路由... }); });
这里要注意两个关键点:
- 把无auth的路由放在带auth的路由组前面,避免原路由组里的同路径路由先被匹配到(那样还是会触发auth验证)
- 单独的路由组必须加上
['namespace' => 'Lawyer'],否则Laravel会去默认控制器命名空间找UrlProfileController,而不是Lawyer子命名空间下的,导致控制器找不到,看起来像路由不生效
额外注意:清除路由缓存
如果你之前运行过php artisan route:cache生成过路由缓存,修改路由后一定要执行:
php artisan route:clear
不然新的路由配置不会生效,这也是很多人改路由后没效果的常见坑。
内容的提问来源于stack exchange,提问作者Berke
相关产品推荐
相关产品推荐

