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 и различными вспомогательными методами.
Несмотря на то, что вы всегда можете переопределить конструктор контроллера действий, мы не рекомендуем делать этого. 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'
));
}
}
Zend_Controller_Action определяет два метода, которые вызываются до и после требуемого действия, preDispatch() и postDispatch(). Они могут быть полезны во многих случаях: проверка аутентификации и прав пользователя до запуска действия (действие может быть пропущено через вызов _forward() в preDispatch()) или размещение сгенерированного содержимого в боковой части сайта (метод postDispatch()).
Вместе с объектом регистрируются некоторые объекты и переменные, для них есть свои методы доступа.
Объект запроса: 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).
Кроме методов доступа, Zend_Controller_Action имеет несколько вспомогательных методов для выполнения некотрорых общих задач в методах действий (или в pre-/post-dispatch).
_forward($action, $controller = null, $module = null, array $params = null): выполняет другое действие. Если этоот метод вызывается в preDispatch(), то текущее действие будет пропущено, вместо этого начинает выполняться другое действие. В остальных случаях выполнение этого действия начинается только после выполнения текущего действия.
_redirect($url, $code = 302): производит перенаправление по другому адресу. Этот метод принимает URL и код статуса HTTP (необязательный параметр). Перенаправление производится сразу и выполнение программы прерывается.
Если был задан код статуса, то он будет передан команде PHP header() при произведении перенаправления.