Всем нам знакома страница Whoops, looks like something went wrong
. Мы можем легко модифицировать её под нужды нашего клиентского шаблона. Для этого достаточно изменить файл app/Exceptions/Handler.php
, переопределив в классе Handler
методconvertExceptionToResponse
:
<?php namespace App\Exceptions;
use Exception;
use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler;
use Symfony\Component\Debug\ExceptionHandler as SymfonyDisplayer;
class Handler extends ExceptionHandler
{
/**
* Convert the given exception into a Response instance.
*
* @param \Exception $e
*
* @return \Symfony\Component\HttpFoundation\Response
*/
protected function convertExceptionToResponse(Exception $e)
{
$debug = config('app.debug', false);
if ($debug) {
return (new SymfonyDisplayer($debug))->createResponse($e);
}
return response()->view('errors.default', ['expection' => $e], 500);
}
}
Теперь достаточно создать вьюху errors.default
по путиresources/view/errors/default.blade.php
и привести её к нужному виду.
Если переменная окружения APP_DEBUG
будет равна true
, то при ошибке мы увидим страницу с отладочной информацией об ошибке, а не страницу ошибки по умолчанию.
Примечание
Если мы посмотрим в наш родительский класс Handler
то увидим метод render
, который и содержит логику отображения ошибок:
<?php
namespace Illuminate\Foundation\Exceptions;
// ...
class Handler implements ExceptionHandlerContract
{
// ...
/**
* Render an exception into a response.
*
* @param \Illuminate\Http\Request $request
* @param \Exception $e
* @return \Illuminate\Http\Response
*/
public function render($request, Exception $e)
{
if ($this->isHttpException($e)) {
return $this->toIlluminateResponse($this->renderHttpException($e), $e);
} else {
return $this->toIlluminateResponse($this->convertExceptionToResponse($e), $e);
}
}
// ...
}
Можно заметить, что при Http ошибке мы используем метод renderHttpException
. И, соответственно, пройдя дальше в этот метод мы увидим:
<?php
namespace Illuminate\Foundation\Exceptions;
// ...
class Handler implements ExceptionHandlerContract
{
// ...
/**
* Render the given HttpException.
*
* @param \Symfony\Component\HttpKernel\Exception\HttpException $e
* @return \Symfony\Component\HttpFoundation\Response
*/
protected function renderHttpException(HttpException $e)
{
$status = $e->getStatusCode();
if (view()->exists("errors.{$status}")) {
return response()->view("errors.{$status}", ['exception' => $e], $status);
} else {
return $this->convertExceptionToResponse($e);
}
}
// ...
}
Laravel проверяет наличие вьюхи с соответствующим кодом Http ошибки в папкеresources/views/errors
и, если находит, то отображает эту страницу. Иначе отображается стандартная страница ошибки через метод convertExceptionToResponse
, который мы успешно переопределили выше.