You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 07:18:02