7.5. Контроллеры действий
Пред. | Глава 7. Zend_Controller | След.

## 7.5. Контроллеры действий

### 7.5.1. Введение

`Zend_Controller_Action` является абстрактным классом, который можно использовать в реализации контроллеров действий для последующего их использования с фронт-контроллером при разработке сайта, основанного на паттерне Model-View-Controller (MVC).

Для того, чтобы использовать Zend_Controller_Action, нужно создать его подкласс в действующей директории контроллеров (или расширить его для создания своего базового класса контроллеров действий). Подкласс может содержать методы действий, которые соответствуют различным действиям, которыми должен управлять контроллер. Маршрутизатор и диспетчер компоненты Zend_Controller будут рассматривать любые методы в классе контроллера с именем, заканчивающимся на 'Action', как возможные действия контроллеров.

Для примера предположим, что ваш класс определен следующим образом:

    class FooController extends Zend_Controller_Action
    {
        public function barAction()
        {
            // do something
        }

        public function bazAction()
        {
            // do something
        }
    }

Приведенный выше класс FooController (контроллер 'foo') определяет два действия - 'bar' и 'baz'.

Класс может быть дополнен инициализирующим методом, методом, используемым по умолчанию (если не был вызван метод, либо вызван несуществующий метод), перехватчиками pre- и post-dispatch и различными вспомогательными методами.

### 7.5.2. Инициализация объекта

Несмотря на то, что вы всегда можете переопределить конструктор контроллера действий, мы не рекомендуем делать этого. Zend_Controller_Action::__construct() выполняет некоторые важные задачи, такие, как регистрация объектов запроса и ответа, аргументов вызова, переданных из фронт-контроллера. Если необходимо переопределить контроллер, то всегда вызывайте конструктор родительского класса parent::__construct($request, $response, $invokeArgs) в конструкторе подкласса.

Для осуществления своего инстанцирования более подходящим является метод init(), который вызывается в конце __construct(). Например, если вы хотите устанавливать соединение с БД при инстанцировании:

    class FooController extends Zend_Controller_Action
    {
        public function init()
        {
            $this->db = Zend_Db::factory('Pdo_Mysql', array(
                'host'     => 'myhost',
                'username' => 'user',
                'password' => 'XXXXXXX',
                'dbname'   => 'website'
            ));
        }
    }

### 7.5.3. Перехватчики Pre- и Post-Dispatch

Zend_Controller_Action определяет два метода, которые вызываются до и после требуемого действия, preDispatch() и postDispatch(). Они могут быть полезны во многих случаях: проверка аутентификации и прав пользователя до запуска действия (действие может быть пропущено через вызов _forward() в preDispatch()) или размещение сгенерированного содержимого в боковой части сайта (метод postDispatch()).

### 7.5.4. Методы доступа

Вместе с объектом регистрируются некоторые объекты и переменные, для них есть свои методы доступа.

- Объект запроса: getRequest() может использоваться для получения объекта запроса, используемого при вызове действия.

- Объект ответа: getResponse() может использоваться для получения объекта ответа. Некоторые типичные вызовы могут выглядеть следующим образом:

      $this->getResponse()->setHeader('Content-Type', 'text/xml');
      $this->getResponse()->appendBody($content);

- Аргументы вызова: фронт-контроллер может добавлять параметры в маршрутизатор, диспетчер и контроллер действий. Для их получения используйте getInvokeArg($key), можно также извлечь весь список аргументов, используя метод getInvokeArgs().

- Параметры запроса: Объект запроса включает в себя параметры запроса, такие, как значения _GET, _POST, или параметры, определенные в пути URL. Для их получения используйте `_getParam($key)` или `_getAllParams()`. Вы можете также установить параметры запроса, используя метод `_setParam()`, это полезно при перенаправлении на другие действия через метод `_forward()`.

  Для определения того, существует ли параметр или нет (полезно для логического ветвления), используйте _hasParam($key).

### 7.5.5. Вспомогательные методы

Кроме методов доступа, Zend_Controller_Action имеет несколько вспомогательных методов для выполнения некотрорых общих задач в методах действий (или в pre-/post-dispatch).

- _forward($action, $controller = null, $module = null, array $params = null): выполняет другое действие. Если этоот метод вызывается в preDispatch(), то текущее действие будет пропущено, вместо этого начинает выполняться другое действие. В остальных случаях выполнение этого действия начинается только после выполнения текущего действия.

- _redirect($url, $code = 302): производит перенаправление по другому адресу. Этот метод принимает URL и код статуса HTTP (необязательный параметр). Перенаправление производится сразу и выполнение программы прерывается.

  Если был задан код статуса, то он будет передан команде PHP header() при произведении перенаправления.

Пред. | Уровень выше | След.
7.4. Готовые подклассы | Начало | 7.6. Плагины