应用中间件必须配置在各应用子目录的middleware.php中,如app/admin/middleware.php;需返回含完整类名的数组,命名空间与路径严格匹配,且注册后作用于该应用全部请求。

应用中间件必须放在对应应用目录的 middleware.php 里
多应用模式下(app/multi_app 开启),全局 app/middleware.php 的配置完全不生效。你得去每个应用子目录下单独配,比如后台应用在 app/admin/middleware.php,API 应用在 app/api/middleware.php。
这个文件必须存在、必须返回数组、且数组元素要是完整类名字符串:
-
return [\app\admin\middleware\AuthCheck::class];✔️(推荐带命名空间全称) -
return ['app\admin\middleware\AuthCheck'];✔️(字符串写法也行) -
return ['auth'];❌(没在 alias 里映射就报错Middleware not found: auth) - 删掉该文件、或文件里写了
echo、或返回null,中间件直接静默失效
命名空间和路径必须严格匹配应用结构
中间件类文件不能乱放:框架只扫描 app/{应用名}/middleware/ 目录(如 app/admin/middleware/AuthCheck.php),不会递归子目录,也不能放在 app/middleware/ 下。
- 文件路径:
app/admin/middleware/AuthCheck.php - 命名空间必须是:
namespace app\admin\middleware;(不是app\middleware) - 类名必须与文件名一致:
class AuthCheck - 手动生成时用命令行更稳:
php think make:middleware admin/AuthCheck,再手动调整命名空间
应用中间件注册后默认作用于整个应用
它不像路由中间件能用 ->except() 排除某些路径,应用级中间件一旦注册,就会拦截该应用下所有请求——包括静态资源、未定义路由、甚至 404 页面。
- 若只想保护部分接口,改用路由分组绑定:
Route::group(['middleware' => 'auth'])->rule(...) - 若必须用应用中间件,只能在
handle()里手动判断路径放行:if ($request->path() === 'admin/login') { return $next($request); } - 注意执行顺序:应用中间件在全局中间件之后、路由调度之前运行,所以
$request->route()还拿不到路由信息
别名注册要同步到应用 middleware.php 才有效
别名(alias)不是全局共享的。即使你在 config/middleware.php 里定义了 'auth' => \app\admin\middleware\AuthCheck::class,app/admin/middleware.php 里仍得显式写 'auth' 或全类名。
- 正确写法:
return ['auth'];(前提是 config/middleware.php 的 alias 已配好) - 错误写法:
return ['auth'];但 config/middleware.php 根本没定义 alias —— 报错 - 更稳妥的做法:直接写全类名,绕过别名机制,避免跨文件依赖
最容易被忽略的是:应用中间件的 handle() 方法里如果提前 return 了非 Response 实例(比如 json() 返回数组、或漏写 return),整个请求就中断且无提示。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











