TP6中间件无法直接接收路由或自定义参数,须通过$request->param()或$request->route()获取;禁用构造函数传参,应读配置;校验失败须返回Response对象;跨中间件传值用$request->withAttribute()。

TP6中间件本身不支持直接接收路由参数或控制器传入的“自定义参数”,所谓“参数传递报错”,本质是误用了调用方式或混淆了请求生命周期——中间件只处理 $request 和 $next,不能像控制器方法那样通过函数签名接收变量。修复关键在于:改用请求对象取值、避免硬编码依赖、统一数据注入入口。
中间件里拿不到路由参数?用$request->param()或$request->route()
很多人在中间件中写 $id = $request->id 或 input('id') 报错,是因为这些不是中间件的合法访问方式。
- 正确做法是调用
$request->param('id')(获取所有合并参数,含GET/POST/Route) - 若需精确区分来源,用
$request->route('id')(仅从路由变量取,如user/:id) - 调试时可先
dump($request->param())确认参数是否已解析,别只看URL字符串
想传配置或开关?走配置文件或环境变量,别塞中间件构造函数
给中间件加 __construct($enableLog = true) 是无效的——TP6容器不会自动注入构造参数,强行写会导致实例化失败或类型错误。
- 需要开关控制逻辑?统一读配置:
config('middleware.auth.debug') - 需动态白名单?存到
config/auth.php或.env中,如AUTH_SKIP_ROUTES=api/health,api/ping - 临时调试用,可在中间件内硬编码数组,但上线前必须抽离
参数校验失败后无法继续?确保返回Response,别中断流程
常见错误:在中间件里检查 $request->param('token') 为空就 exit(json(['code'=>400])),结果页面空白或响应头错乱。
- 必须返回标准响应对象,例如:
return json(['code'=>400, 'msg'=>'缺少token'])->code(400) - 若需重定向,用
redirect()->to('/login')->code(302),别用 header()+exit - 切记不能 return null、return false 或 throw 新异常(除非你已重写异常处理器)
多级中间件间“传参”?用$request->withAttribute()挂载数据
比如权限中间件查出用户角色,想让日志中间件记录该角色——不能靠全局变量或静态属性,应使用PSR-7标准属性机制。
- 在前一个中间件中:
$request = $request->withAttribute('user_role', 'admin') - 在后续中间件中:
$role = $request->getAttribute('user_role', 'guest') - 该方式线程安全、无副作用,且兼容 CLI 和 HTTP 场景

















