Laravel 未显示 TokenMismatchException 的自定义错误页面

Laravel custom error page not displaying for TokenMismatchException

每当我收到 TokenMismatchException 错误时,Chrome 工具都会显示 HTTP 响应代码为 500。

但是,我没有看到我的 errors/500.blade.php 自定义错误页面。

我怎样才能让它按预期工作?

您可以在 App\Exceptions\Handler.php

中处理异常
public function render($request, Exception $exception)
{
    // 404 page when a model is not found
    if ($exception instanceof ModelNotFoundException) {
        return response()->view('errors.404', [], 404);
    }

    // Custom error 500 view on production
    if (app()->environment() == 'production') {
        return response()->view('errors.500', [], 500);
    }

    return parent::render($request, $exception);
}

您的 errors/ 目录中应该有 500.blade.php 和 404.blade.php

Laravel 只会将您的 [error_code].blade.php 文件用于 HttpException 的实例。由于 TokenMismatchException 不是 HttpException 的实例,因此 Laravel 不会呈现您的 500.blade.php(开箱即用)。

正如@Comrade 指出的那样,您可以在 App\Exceptions\Handler class.

中更改此行为

为此,您可以在 render() 方法中显式检查异常:

public function render($request, Exception $exception)
{
    if ($exception instanceof TokenMismatchException) {
        return response()->view('errors.500', compact('exception'), 500);
    }

    return parent::render($request, $exception);
}

或者,您可以覆盖 prepareException()ModelNotFoundExceptionAuthorizationException 的处理方式)。为此,只需将以下内容添加到您的 App\Exceptions\Handler:

protected function prepareException(Exception $e)
{
    $e = parent::prepareException($e);

    if ($e instanceof TokenMismatchException) {
        $e = new HttpException(500, $e->getMessage());
    }

    return $e;
}

不要忘记导入 TokenMismatchExceptionHttpException (Symfony\Component\HttpKernel\Exception\HttpException)。

希望对您有所帮助!