← Заметки и статьи о Laravel PHP

25 августа 2015 перевод

Изменяем стандартную страницу ошибки в Laravel 5.1

Всем нам знакома страница Whoops, looks like something went wrong. Мы можем легко модифицировать её под нужды нашего клиентского шаблона. Для этого достаточно изменить файл app/Exceptions/Handler.php, переопределив в классе Handler метод convertExceptionToResponse:

<?php namespace AppExceptions;

use Exception;
use IlluminateFoundationExceptionsHandler as ExceptionHandler;
use SymfonyComponentDebugExceptionHandler as SymfonyDisplayer;

class Handler extends ExceptionHandler
{
    /**
     * Convert the given exception into a Response instance.
     *
     * @param Exception $e
     *
     * @return SymfonyComponentHttpFoundationResponse
     */
    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 IlluminateFoundationExceptions;

// ...

class Handler implements ExceptionHandlerContract
{
	// ...

    /**
     * Render an exception into a response.
     *
     * @param  IlluminateHttpRequest  $request
     * @param  Exception  $e
     * @return IlluminateHttpResponse
     */
    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 IlluminateFoundationExceptions;

// ...

class Handler implements ExceptionHandlerContract
{
	// ...
    /**
     * Render the given HttpException.
     *
     * @param  SymfonyComponentHttpKernelExceptionHttpException  $e
     * @return SymfonyComponentHttpFoundationResponse
     */
    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, который мы успешно переопределили выше.

Источник: http://crynobone.com/posts/9/customizing-the-default-error-page-on-laravel-5.1

Плюсануть
Поделиться
Отправить