如何为Slim 2添加中间件?遇到路由中间件必须可调用报错
错误原因
你在$app->map方法中直接执行了$authenticateForRole($UserId, $token),此时传入路由中间件参数的是函数执行后的返回值(布尔类型),而Slim要求所有路由中间件必须是可调用的结构,因此抛出该异常。
修正方案
你需要将中间件改造成高阶工厂函数,传入自定义参数后返回符合Slim规范的可调用闭包即可。
1. 调整中间件定义
$authenticateForRole = function ( $user_Id, $tokenKey ) { // 返回符合Slim中间件签名的可调用闭包 return function ($request, $response, $next) use ($user_Id, $tokenKey) { try { // 原有身份校验逻辑写在这里 $validatePass = true; // 替换为你自己的校验逻辑判断 if (!$validatePass) { // 校验失败直接返回响应,终止后续逻辑执行 return $response->withStatus(401)->write('身份校验不通过'); } // 校验通过,将请求传递给下一个中间件/路由处理函数 return $next($request, $response); } catch (\Throwable $th) { return $response->withStatus(500)->write($th->getMessage()); } }; };
2. 调整路由注册写法
$app->map('/averageresponsetime/', $authenticateForRole($UserId, $token), function ($request, $response) use ($app, $post1) { return $response ->withHeader('Content-Type', 'application/json') ->write(json_encode($post1)); })->via('POST'); $app->run();
注意事项
- Slim中间件不可直接返回布尔值,校验失败需返回响应对象中断流程,校验通过需调用
$next传递请求 - 路由处理函数不要直接
echo输出内容,统一通过响应对象返回数据
内容的提问来源于stack exchange,提问作者Sandhya Srishti
相关产品推荐
相关产品推荐

