PHP: Slim Framework Exception Handling


PHP: Slim Framework Exception Handling

我刚刚用纤薄的框架创建了一个 API 应用程序,最初,在我的代码中,我使用依赖容器来处理抛出的所有异常,代码如下。

//Add container to handle all exceptions/errors, fail safe and return json
$container['errorHandler'] = function ($container) {
    return function ($request, $response, $exception) use ($container) {
        //Format of exception to return
        $data = [
            'message' => $exception->getMessage()
        ];
        return $container->get('response')->withStatus(500)
            ->withHeader('Content-Type', 'application/json')
            ->write(json_encode($data));
    };
};

但是,与其一直抛出 500 Server Error,我还想添加其他 HTTPS 响应代码。我想知道我是否可以获得有关如何做到这一点的帮助。

public static function decodeToken($token)
{
    $token = trim($token);
    //Check to ensure token is not empty or invalid
    if ($token === '' || $token === null || empty($token)) {
        throw new JWTException('Invalid Token');
    }
    //Remove Bearer if present
    $token = trim(str_replace('Bearer ', '', $token));
    //Decode token
    $token = JWT::decode($token, getenv('SECRET_KEY'), array('HS256'));
    //Ensure JIT is present
    if ($token->jit == null || $token->jit == "") {
        throw new JWTException('Invalid Token');
    }
    //Ensure User Id is present
    if ($token->data->uid == null || $token->data->uid == "") {
        throw new JWTException("Invalid Token");
    }
    return $token;
}

问题更多地来自上述函数,因为 slim 框架决定隐式处理所有异常,我无法访问使用 try catch 来捕获任何错误

没那么难,很简单。重写代码:

container['errorHandler'] = function ($container) {
    return function ($request, $response, $exception) use ($container) {
        //Format of exception to return
        $data = [
            'message' => $exception->getMessage()
        ];
        return $container->get('response')->withStatus($response->getStatus())
            ->withHeader('Content-Type', 'application/json')
            ->write(json_encode($data));
    };
}

那么这段代码有什么作用呢?您基本上像以前一样传递$response,此代码的作用是它从$response对象获取状态代码并将其传递给withStatus()方法。

用于引用状态的苗条文档。

您可以使用

Slim'Http'Response对象的withJson()方法

class CustomExceptionHandler
{
    public function __invoke(Request $request, Response $response, Exception $exception)
    {
        $errors['errors'] = $exception->getMessage();
        $errors['responseCode'] = 500;
        return $response
            ->withStatus(500)
            ->withJson($errors);
    }
}

如果你正在使用依赖注入,你可以这样做

$container = $app->getContainer();
//error handler
$container['errorHandler'] = function (Container $c) {
  return new CustomExceptionHandler();
};