首页不自动触发权限中间件,必须显式绑定;若未在路由定义中用middleware()方法挂载、未纳入带中间件的路由组、或未在config/middleware.php的'route'键配置命名路由,中间件完全不执行,且$request->rule()->getName()为空时易引发空对象调用错误。

首页不自动触发权限中间件,必须显式绑定——否则即使写了中间件也完全不执行。
为什么首页路由默认不走权限中间件
ThinkPHP6 的中间件不会自动应用到所有路由。首页(如 / 或 /index)若未在路由定义中显式绑定中间件,或未被包含在启用了中间件的路由组内,CheckPermission 这类中间件根本不会运行。
- 常见错误:只在
app/middleware.php的全局'http'数组里注册了中间件,但没绑定到首页路由 - 更隐蔽的问题:首页用的是闭包路由(
Route::get('/', function(){...})),而闭包路由不支持自动继承全局中间件 -
$request->rule()->getName()在首页未命名时返回null,若中间件里没判空会直接报Call to a member function getName() on null
首页绑定权限中间件的三种可靠方式
必须选其中一种,不能依赖“全局注册就万事大吉”:
- 方式一(推荐):给首页路由显式加中间件
Route::get('/', 'IndexController@index')->name('home')->middleware('check_permission'); - 方式二:把首页放进带中间件的路由组
Route::group('', function () { Route::get('/', 'IndexController@index')->name('home'); })->middleware('check_permission'); - 方式三:在
config/middleware.php的'route'键下配置(仅对命名路由生效)'route' => ['home' => ['check_permission']],前提是首页已用->name('home')
首页权限校验要绕开哪些坑
首页往往承担欢迎页、游客入口、SEO落地页等角色,硬套权限逻辑容易导致 401/403 把访客拦在外面:
立即学习“PHP免费学习笔记(深入)”;
- 免登录白名单必须覆盖首页路径:
str_starts_with($path, '/') && $path === '/'或直接在白名单数组加'/' - 别在首页中间件里调
Auth::check()后直接abort(403)——游客应能访问首页,登录态才决定后续跳转 - 如果首页需要动态展示「登录后菜单」,权限中间件应只注入用户信息(
$request->withAttribute('user', $user)),把展示逻辑留给控制器,而非拦截请求 - JWT 场景下,首页若需校验 token,中间件应允许
Authorization头缺失时静默放行,而不是一律 401
检查中间件是否真正在首页运行
最简单的验证方式:在 handle() 开头加一行日志或 dump:
public function handle($request, \Closure $next)
{
\think\facade\Log::info('CheckPermission running on: ' . $request->url());
// ...后续逻辑
}
访问首页后查日志;若没输出,说明中间件根本没挂载成功。这时候回看路由定义比调试逻辑更有效。
真正容易被忽略的是:首页路由名为空或为 null 时,权限中间件里基于 $request->rule()->getName() 的节点匹配会直接崩掉——这个空值判断不是可选项,是必填项。



















