Как мне создать достойный обработчик ошибки 404 для CodeIgniter?

CodeIgniter имеет файл /system/application/errors/error_404.php, который отображается, когда возникает ошибка 404 из-за того, что фактически является состоянием «контроллер не найден». Однако для моего проекта мне действительно нужно, чтобы эта ошибка обрабатывалась так же, как если метод отсутствует в классе контроллера. В этом случае я показываю обычное представление с красивой страницей «Страница не найдена: возможно, вы имели в виду это?...» с навигацией, созданной базой данных, и т. д.

Я думаю, что я мог бы сделать одну из двух вещей:

  1. Создайте вызов header("Location: /path/to/error_page") для перенаправления на обработчик 404 существующего (или специального) контроллера.
  2. Добавьте какой-нибудь маршрутизатор по умолчанию, чтобы справиться с этим.

Как лучше всего добиться необходимого результата? Есть ли подводные камни, на которые стоит обратить внимание?


person Mark Hatton    schedule 11.05.2009    source источник


Ответы (1)


Я использую CodeIgniter со Smarty. В моем классе Smarty есть дополнительная функция, которая называется notfound(). Вызов notfound() устанавливает правильное расположение заголовка на странице 404, а затем отображает шаблон 404. Шаблон имеет переопределяемый заголовок и сообщение, поэтому он очень универсален. Вот пример кода:

Smarty.class.php

function not_found() {
header('HTTP/1.1 404 Not Found');

if (!$this->get_template_vars('page_title')) {
    $this->assign('page_title', 'Page not found');
    }

    $this->display('not-found.tpl');
    exit;
}

В контроллере я могу сделать что-то вроде этого:

$this->load->model('article_model');
$article = $this->article_model->get_latest();

if ($article) {
    $this->smarty->assign('article', $article);
    $this->smarty->view('article');
} else {
    $this->smarty->assign('title', Article not found');
    $this->smarty->not_found();
}

Точно так же я могу изменить код в /system/application/error/error_404.php на:

$CI =& get_instance();
$CI->cismarty->not_found();

Он отлично работает, использует небольшой объем кода и не дублирует функции 404 для разных типов отсутствующих сущностей.

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

Обновление: я использую пользовательскую оболочку Smarty, аналогичную описанной здесь:

Использование Smarty с CodeIgniter

person GloryFish    schedule 12.05.2009