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()
(ModelNotFoundException
和 AuthorizationException
的处理方式)。为此,只需将以下内容添加到您的 App\Exceptions\Handler
:
protected function prepareException(Exception $e)
{
$e = parent::prepareException($e);
if ($e instanceof TokenMismatchException) {
$e = new HttpException(500, $e->getMessage());
}
return $e;
}
不要忘记导入 TokenMismatchException
和 HttpException
(Symfony\Component\HttpKernel\Exception\HttpException
)。
希望对您有所帮助!
每当我收到 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()
(ModelNotFoundException
和 AuthorizationException
的处理方式)。为此,只需将以下内容添加到您的 App\Exceptions\Handler
:
protected function prepareException(Exception $e)
{
$e = parent::prepareException($e);
if ($e instanceof TokenMismatchException) {
$e = new HttpException(500, $e->getMessage());
}
return $e;
}
不要忘记导入 TokenMismatchException
和 HttpException
(Symfony\Component\HttpKernel\Exception\HttpException
)。
希望对您有所帮助!