- 1. simpleController
- 2. simple403Controller
- 3. simple404Controller
- 4. messageController
- 5. Передача управления другому контроллеру
- 6. Переадресация
Базовый контроллер, от которого наследуются все контроллеры приложения. При создании объекта этого класса в защищённые (protected) свойства инициализируется ряд системных объектов, необходимых для работы конечных контроллеров.
Данный контроллер запускается в случае, когда не хватает прав доступа на запуск действия. К моменту написания главы его реализация выглядела следующим образом:
<?php class simple403Controller extends simpleController { public function getView() { $module = 'page'; $action = 'view'; $name = '403'; if ($this->request->getModule() == $module && $this->request->getString('name') == $name && $this->request->getAction() == $action) { throw new mzzRuntimeException('Recursion detected: the 403 controller was called twice.'); } $header = $this->request->getBoolean('403header'); $this->request->setModule($module); $this->request->setParams(array('name' => $name)); $this->request->setAction($action); if ($header) { $this->response->setStatus(403); } return $this->forward($module, $action); } } ?>
Как видно из кода, устанавливались значения, обеспечивающие запуск страницы 403 вместо вызываемого модуля. А также отправка соответствующих заголовков пользователю.
Данный контроллер запускается в случае, когда запрашиваемый объект не найден:
<?php class simple404Controller extends simpleController { /** * Свойство, определяющее - отправлять контент или только заголовки * * @var boolean */ protected $onlyHeaders; /** * Результат работы контроллера, обрабатывающего 404 ошибку конкретных ДО * * @var string */ private $result; /** * Конструктор * * @param boolean $onlyHeaders */ public function __construct($onlyHeaders = false) { parent::__construct(); $this->onlyHeaders = (bool)$onlyHeaders; } /** * Установка результата работы 404 контроллера для определенного маппера * * @param simpleMapper $mapper */ public function applyMapper(mapper $mapper) { $this->result = $this->forward404($mapper); } protected function getView() { $this->response->setStatus(404); if ($this->result) { return $this->result; } $module = 'page'; $action = 'view'; $name = '404'; if ($this->request->getModule() == $module && $this->request->getString('name') == $name && $this->request->getAction() == $action) { throw new mzzRuntimeException('Recursion detected: the 404 controller was called twice.'); } $this->request->setModule($module); $this->request->setParams(array('name' => $name)); $this->request->setAction($action); return $this->onlyHeaders ? false : $this->forward($module, $action); } } ?>
Как видно из кода, устанавливались значения, обеспечивающие запуск страницы 404 вместо вызываемого модуля. А также отправка соответствующих заголовков пользователю.
Контроллер, используемый для различных информационных сообщений и предупреждений. Типичный пример использования данного контроллера:
$controller = new messageController('Запрашиваемая новость не найдена', messageController::INFO); return $controller->run();
Вторым аргументом может быть передан тип выводимого сообщения. По умолчанию messageController::WARNING.
Доступны следующие типы:
messageController::INFO- сообщение информационного характера.messageController::WARNING- предупреждение.
В случае необходимости существует возможность из текущего контроллера передать управление другому контроллеру. Запуск действия list модуля news будет выглядеть так:
$this->forward('news', 'list');
Также предусмотрен метод для передачи управления в случае необходимости вывода ошибки 404 (объект не найден). Вызов этого метода будет выглядеть так:
$this->forward404($newsMapper);
Аргумент $newsMapper необязательный, но он определяет класс, при поиске объекта которого была получена данная ошибка. Если для этого класса определён свой контроллер-обработчик, то будет вызван именно он. В противном случае - simple404Controller. Аналогичным методом передаётся управление через метод forward403.
Переадресация в контроллерах осуществляется с помощью метода redirect:
$this->redirect($url); // в переменной $url хранится адрес, на который нужно перейти