20 Июнь 2011

Организация ошибки 404 в Kohana. Видеоурок 20

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

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

Понятно, что кодовые сообщения способен воспринимать лишь робот — в нашем случае роботом является паук поисковой системы. Получив код 404 паук поймет, что запрашиваемая страница недоступна (придя еще несколько раз и убедившись в наличии кода 404, робот больше не будет пытаться индексировать эту страницу).

Кроме того, необходимо создать отдельный файл вида страницы с надписью «Запрашиваемая страница не найдена», которая будет показываться одновременно с генерацией кода 404 и отпугивать не только робота, но и человека разумного.

Выполнением поставленной задачи мы и займемся, реализовав описанное на фреймворке Kohana 3.1.

Видеоурок:

Скачать видеоурок (*wmv, 19.8 МБ)

Скачать исходники (*.zip, 1.15 МБ)

Хочу заменить, что особенностью фреймворка Kohana является генерация exception (сообщение об ошибке, мы уже встречались с ним в 11 видеоуроке по Kohana) при появлении ошибки 404 (страница не найдена). При этом exception-404 автоматически обрабатывается путем появления соответствующей картины в браузере (см. рис. 1)

Обработка 404 в Kohana

Рис. 1. Результат запроса несуществующей страницы в браузере.

Проследить код, возвращаемый сервером, можно установив плагин HTTP Headers для Google Chrome.

Плагин для Google Chrome HTTP Headers

Рис. 2. Плагин HTTP Headers для Google Chrome показывает код ошибки 404.

Кстати, если страница загружена успешно, то сервер вернет код 200.

Первый путь решения задачи

Предположим, что у нас есть какая-то страница и мы хотим получить код 404 при ее загрузке. Для этого достаточно в контроллере, генерирующем данную страницу, установить следующий код:

Request::initial()->response()->status(404);

Второй путь решения задачи

Второй путь будет в корне отличаться от первого. Генерировать ошибку 404 мы будем при помощи выбрасывания соответствующего exception:

throw new HTTP_Exception_404('File not found!');

Код выбрасывания exception нужно разместить в том месте, где происходит обращение к странице с ошибкой 404. Например, в одном из контроллеров, при выполнении определенного условия, необходимо отобразить страницу 404 — вот туда-то и нужно будет подставить вышеобозначенный код вызова exception-404.

Следующее, что нам понадобится — это организовать специальный класс, обрабатывающий exception-404. Для этих целей создадим файл kohana\www\application\classes\exceptionhandler.php.

Код файла exceptionhandler.php приведен в листинге 1.

Листинг 1. Код файла exceptionhandler.php

<?php defined('SYSPATH') or die('No direct script access.');

class Exceptionhandler
{
    public static function handle(Exception $e)
    {
        switch (get_class($e))
        {
            case 'Http_Exception_404':
                $response = new Response;
                $response->status(404);
                $view = new View('404view');
                $view->message = $e->getMessage();
                echo $response->body($view)->send_headers()->body();
                return TRUE;
                break;
            default:
                return Kohana_Exception::handler($e);
                break;
        }
    }
}

Пояснения к листингу 1:

7-я строка. При помощи оператора switch происходит обработка всех exception, поступающих на вход метода handle.

9-я строка. Если exception представляет из себя 404-ошибку (Http_Exception_404), то обработать его согласно нижеследующему коду.

11-я строка. Устанавливается код 404 для ответа сервера.

12-я строка. Указывается путь к файлу вида, который будет отображен в результате обработки данного exception. В моем случае это файл kohana\www\application\views\404view.php (код, хранящийся в файле 404view.php приведен в листинге 2).

13-я строка. Осуществляется вывод сообщения, передаваемого в теле exception (в случае примера сообщение File not found!), в переменную message, получаемую в виде (см. листинг 2).

Листинг 2. Код файла вида для страницы 404 kohana\www\application\views\404view.php

<p>Страница не найдена</p>
<?=$message?>

Теперь остается поправить файл bootstrap.php (kohana2\www\application\bootstrap.php). В самый конец необходимо добавить следующий код:

set_exception_handler(array('Exceptionhandler', 'handle'));

Exceptionhandler — имя класса, обрабатывающего возникновение 404-exception.

Handle — метод, обрабатывающий exception в классе Exceptionhandler.

<< Предыдущая публикация курса Следующая публикация курса >>

С уважением, Андрей Морковин.