Всем нам знакома страница Whoops, looks like something went wrong
. Мы можем легко модифицировать её под нужды нашего клиентского шаблона. Для этого достаточно изменить файл app/Exceptions/Handler.php
, переопределив в классе Handler
методconvertExceptionToResponse
:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
|
<?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
, который и содержит логику отображения ошибок:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
|
<?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
. И, соответственно, пройдя дальше в этот метод мы увидим:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
|
<?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
, который мы успешно переопределили выше.
Понравилась статья или книга? Поделись с друзями: