ChatGPT 是只不错的 “小黄鸭”
今天遇到一个问题,在使用 Symfony 6.x 框架的项目里,我没有使用框架自带的 Security 组件,而是自己实现了一个用户认证的土方法。 在我的方法中,当用户请求需要登录的接口时,会抛出一个自定义的异常 ApiNotAuthException,然后我在 ExceptionListener 监听器服务中捕获这个异常并封装我自己的返回值结构,最后将状态码强制改为 200(因为我不喜欢使用 HTTP 状态码来替代业务状态码)。 PS: 关于是否应该忽略 HTTP 状态码在前端的处理以及是否应该将业务状态码封装到 HTTP 状态码里,以后有机会我再写一篇博客讨论一下,今天只解决问题。 我的异常监听类是这样的: final class ExceptionListener { public function onKernelException(ExceptionEvent $event) { $e = $event->getThrowable(); if ($e instanceof ApiNotAuthException) { $response = new JsonResponse([ 'success' => false, 'code' => $e->getCode(), // 我的业务状态码 'msg' => $e->getMessage(), 'data' => null, ], Response::HTTP_OK); // 初始化时设置状态码为 200 $response->setStatusCode(Response::HTTP_OK); // 初始化之后再次设置状态码为 200 $response->headers->set('X-Status-Code', Response::HTTP_OK); $event->setResponse($response); } } } 这样做的目的是为了让前端可以统一处理业务状态码,而不用关心 HTTP 状态码。 此外因为我觉得 HTTP 状态码应该是用来表示请求的状态,而不是业务状态,而登录与否应该属于业务层面。 总之就是状态码的改变没效果,HTTP Headers 中的 X-Status-Code 有效果,说明代码确实执行了。 ...