如何从 Laravel 中抛出的异常中获取 HTTP 状态代码?

par*_*ing 7 php laravel

我目前正在 App/Exceptions/Handler.php 中集成一些逻辑。我希望能够访问 $exception 变量上的 HTTP 状态代码:

public function report(Throwable $exception)
{
    dd($exception->statusCode);
    parent::report($exception);
}
Run Code Online (Sandbox Code Playgroud)

但是我收到以下错误:

ErrorException 未定义的属性:ErrorException::$statusCode

当我dd($exception)得到以下信息时:

Symfony\Component\HttpKernel\Exception\NotFoundHttpException {#1214 ?
  -statusCode: 404
  -headers: []
  #message: ""
  #code: 0
  #file: "C:\Users\CEX\Documents\GitHub\unified\vendor\laravel\framework\src\Illuminate\Routing\AbstractRouteCollection.php"
  #line: 43
  trace: {?}
}
Run Code Online (Sandbox Code Playgroud)

我如何访问statusCode

Tof*_*del 6

如果您查看源代码,Symfony\Component\HttpKernel\Exception\NotFoundHttpException您会发现它扩展了Symfony\Component\HttpKernel\Exception\HttpException如果您查看类的声明,您将看到它$statusCode是私有的,但它有一个 getter 方法

class HttpException extends \RuntimeException implements HttpExceptionInterface
{
    private $statusCode;
    private $headers;

    public function __construct(int $statusCode, string $message = null, \Throwable $previous = null, array $headers = [], ?int $code = 0)
    {
        $this->statusCode = $statusCode;
        $this->headers = $headers;

        parent::__construct($message, $code, $previous);
    }

    public function getStatusCode()
    {
        return $this->statusCode;
    }
    //...
}

Run Code Online (Sandbox Code Playgroud)

因此,您只需要$exception->getStatusCode()检索状态代码(在您的情况下为 404),尽管您应该进行检查以确保您的 throwable 实现了,HttpExceptionInterface因为情况可能并非总是如此,因此该方法将不存在,您会得到致命错误

if ($exception instanceof \Symfony\Component\HttpKernel\Exception\HttpExceptionInterface) {
  $code = $exception->getStatusCode();
}
Run Code Online (Sandbox Code Playgroud)