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() при произведении перенаправления.