不能。Laravel中间件仅在HTTP请求生命周期中执行,依赖Request和$next,而模型事件属于Eloquent数据操作层,无请求上下文,环境不匹配必然报错;应使用Observer、Events或Policy实现数据变更控制。

不能。
Laravel 8.x 的中间件是 HTTP 请求生命周期中的组件,只在请求进入应用、经过内核(Kernel.php)定义的中间件管道时执行。它的设计目标是处理 Request → Response 流程,与模型事件(如 created、updated、saved 等)完全处于不同上下文:
-
模型事件发生在 Eloquent ORM 层,属于数据操作阶段,通常在控制器、服务类或队列任务中触发,不涉及 HTTP 请求对象(
Request)、响应对象(Response)或路由信息; -
中间件依赖
Illuminate\Http\Request和Closure $next,必须挂载在路由或分组上,由 Laravel 内核调度;它没有Request实例就无法初始化,也无法访问$next()—— 而模型事件里根本不存在这些。
所以,你不能、也不应该在模型事件中“调用中间件”,就像不能在数据库迁移里执行 Auth::user() 一样——环境不匹配,会直接报错(如 Class 'Illuminate\Http\Request' not found 或 Undefined variable: request)。
如果你的真实需求是:
✅ 在模型保存后执行类似中间件的逻辑(如权限校验、日志记录、通知拦截)
→ 应该用 模型观察者(Observer) 或 自定义事件监听器,而不是硬套中间件。
例如:
- 创建
UserObserver监听updating,检查当前用户是否有权修改该记录; - 在
OrderShipped事件监听器中做风控判断,而非试图塞进CheckPermission中间件; - 若需复用中间件里的校验逻辑,可把核心判断抽成独立 Service 类,让中间件和监听器共同调用。
简言之:
- 中间件 ≠ 通用工具函数
- 模型事件 ≠ HTTP 请求入口
- 跨层混用不仅无效,还会破坏框架职责边界
需要做数据变更前后的控制,请用 Observer、Events 或 Policy,别动中间件。


















