Как создать кастомную страницу 404 в Laravel

Как создать кастомную страницу 404 в Laravel

Многих пользователей интересует вопрос о том, как создать кастомную 404 страницу в Laravel. В этой статье будет показано несколько примеров, по которым вы просто сможете добавить отображение кастомной страницы при возникших HTTP-ошибках.

Исключения в PHP похожи на исключения в других языках программирования. Исключения генерируются при возникновении ошибки или неизвестного события. Все исключения PHP расширяют базовый класс исключений Exception.

Помимо этой статьи, ранее была написана ещё одна, на тему обработки исключений при AJAX запросах, ошибках валидации и возвращению ошибок в формате JSON.

Laravel предоставляет класс app/Exceptions/Handler.php, который проверяет все исключения, генерируемые в приложении. По сути, каждое исключение, генерируемое в приложении, может быть индивидуально настроено в этом файле, и может быть создан соответствующий ответ. То есть, вы можете создавать исключения не только на HTTP статус (404, 500, ...), вы имеете возможность настроить рендеринг представления на исключение конкретного типа.

В этой статье я покажу, как создать кастомную страницу для ошибки 404. Вы увидите, как вернуть кастомную страницу в зависимости от типа исключения. По умолчанию Laravel возвращает такую 404 страницу. 404_laravel

Когда посетитель вашего сайта попадает на маршрут, которого не существует, то ваш сайт показывает ошибку 404. Это фактор также влияет и на SEO, где возвращение 404 страницы обязательно в случае, если данные не были найдены.

Итак, давайте посмотрим, как же можно кастомизировать страницу 404, как обрабатывать другие HTTP исключения и пользовательские исключениями в Laravel, и рендерить индивидуально настроенное представление.

Обработка исключений

Все изменения, связанные с обработкой исключений производятся в файле app / Exceptions / Handler.php. В этом файле настраивается всё, что связанно с исключениями, потому, в этом файле и будут прописаны правила, которые будут возвращаться представления, в зависимости от кода HTTP-ошибки.

Кастомная 404 страница

Давайте создадим кастомную страницу 404 в Laravel. В файле app/Exceptions/Handler.php нужно изменить метод render:

public function render($request, Exception $exception)
{
    if ($this->isHttpException($exception)) {
        /** @var HttpExceptionInterface $exception */
        if ($exception->getStatusCode() == 404) {
            return response()->view('errors.404', [], 404);
        }
    }

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

В методе render мы проверяем, является ли исключение исключением типа HTTP. Это важно, потому что мы вызываем метод getStatusCode(), который доступен только для HTTP исключений. Если код ответа 404, то мы возвращаем соответствующее представление. Вы можете изменить название представления на какое-угодно, если пожелаете.

Но теперь нужно создать представление для страницы 404. Для этого, создайте новый файл представления: resources/views/404.blade.php.

<!DOCTYPE html>
<html>
<head>
    <title>Page not found - 404</title>
</head>
<body>
    The page is new custom page. 
</body>
</html>

Если же вы хотите создать кастомную страницу для любого другого исключения HTTP, просто добавьте новый оператор if и измените 404 с новым кодом состояния. Вот метод рендеринга для обработки пользовательских страниц кода состояния 404 и 500:

public function render($request, Exception $exception)
{
    if ($this->isHttpException($exception)) {
        /** @var HttpExceptionInterface $exception */
        if ($exception->getStatusCode() == 404) {
            return response()->view('errors.404', [], 404);
        }

        if ($exception->getStatusCode() == 500) {
            return response()->view('errors.500', [], 500);
        }
    }

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

Или же, чтобы этот метод не захламлялся большим количеством if-ов, можно просто описать конструкцию, в которой будет проверяться существование кастомного файла, и его подключение:

public function render($request, Exception $exception)
{
    if ($this->isHttpException($exception)) {
        /** @var HttpExceptionInterface $exception */
        $view = "errors.{$exception->getStatusCode()}";
        if(view()->exists($view)) {
            return response()->view($view, [], $exception->getStatusCode());
        }
    }

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

В результате чего, вам достаточно всего лишь добавить представление в папку resources/errors с именем кода HTTP-ошибки (например, 404.blade.php, 500.blade.php и т.д.).

В результате чего, при обращении к несуществующей странице уже будет отрендерена новая кастомная страница.

Кастомная страница для пользовательского исключения

Для начала создадим кастомное исключение. Для этого, запустите следующий код, чтобы создать исключение с именем CustomTestingException.

php artisan make:exception CustomTestingException

И после чего, модифицируем метод уже знакомый метод render в файле app/Exceptions/Handler.php:

public function render($request, Exception $exception)
{
    if ($exception instanceof CustomTestingException) {
        return response()->view('errors.testing');
    }
    return parent::render($request, $exception);
}

Если исключение является экземпляром CustomTestingException, оно вернет представление errors.testing.

Вы также можете использовать функцию abort с кодом 404, которая сгенерирует 404 HTTP-код ответа.

Кастомизая ошибок в Laravel 5.8

Если вы счастливый обладатель Laravel версии 5.8, то вам даже не потребуется модификация каких-либо файлов. Теперь вам достаточно всего лишь создать директорию errors внутри resources/views, и создать нужный файл, название которого должно совпадать с именем HTTP-кода ошибки: 404.blade.php, 500.blada.php, ...

По умолчанию Laravel отображает стандартный дизайн ошибок, однако, если вы создадите соответствующие файлы внутри директории errors, фреймворк возьмёт представления с неё.

Резюме

В этой статья я постарался подробно рассказать, как создать свою собственную кастомную страницу при ошибках в Laravel. На примере было рассмотрено несколько способов кастомизации страницы при 404 ошибке, 500, и других пользовательских кастомных ошибках.