Как создать приличный обработчик ошибок 404 для CodeIgniter? - PullRequest
5 голосов
/ 11 мая 2009

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

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

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

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

1 Ответ

2 голосов
/ 12 мая 2009

Я использую 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...