1 <?xml version="1.0" encoding="UTF-8"?>
3 <sect1 id="zend.controller.dispatcher">
4 <title>Диспетчер</title>
6 <sect2 id="zend.controller.dispatcher.overview">
10 Диспетчеризация — это процесс принятия объекта запроса
11 (<classname>Zend_Controller_Request_Abstract</classname>), извлечения
12 содержащихся в нем имени модуля, имени контроллера, имени действия и
13 необязательных параметров, затем инстанцирования контроллера и
14 вызова действия в нем. Если не найдены модуль, контроллер или
15 действие, то будут использоваться значения по умолчанию.
16 <classname>Zend_Controller_Dispatcher_Standard</classname> определяет
17 <code>index</code> как значение по умолчанию для контроллера и
18 действия, и <code>default</code> - для модуля, но позволяет
19 разработчику изменять эти значения, используя
20 <code>setDefaultController()</code>,
21 <code>setDefaultAction()</code> и <code>setDefaultModule()</code>,
26 <title>Модуль, используемый по умолчанию</title>
29 При создании приложения, состоящего из модулей, вы можете
30 захотеть, чтобы для вашего модуля, используемого по умолчанию,
31 тоже использовалось свое пространство имен (по умолчанию для
32 этого модуля оно не используется). Начиная с
33 версии 1.5.0, вы можете устанавливать параметр
34 <code>prefixDefaultModule</code> в true, используя
35 фронт-контроллер или диспетчер.
38 <programlisting language="php"><![CDATA[
39 // Через фронт-контроллер:
40 $front->setParam('prefixDefaultModule', true);
43 $dispatcher->setParam('prefixDefaultModule', true);
47 Это позволяет повторно использовать существующий модуль в
48 качестве используемого по умолчанию в вашем приложении.
53 Диспетчеризация производится циклически во фронт-контроллере.
54 До того, как будет запущен процесс диспетчеризации,
55 фронт-контроллер выполняет маршрутизацию запроса для нахождения
56 пользовательских значений модуля, контроллера, действия и
57 необязательных параметров. Затем он входит в цикл диспетчеризации,
62 В начале каждой итерации цикла он устанавливает флаг в объекте
63 запроса, означающий, что действие было запущено. Если
64 действие или методы pre/postDispatch установленного плагина сбросят
65 этот флаг, то цикл диспетчеризации продолжится и будет произведена
66 попытка обработать новый запрос. Изменяя контроллер и/или действие в
67 запросе и сбрасывая флаг диспетчеризации, разработчик может
68 задавать цепочку запросов для обработки.
72 Метод действия в контроллере, который таким образом управляет
73 диспетчеризацией, называется <code>_forward()</code>; вызывайте
74 этот метод из любых методов pre/postDispatch() или методов действий,
75 указывая действие, контроллер, модуль и опционально любые
76 дополнительные параметры, которые хотите передать новому
80 <programlisting language="php"><![CDATA[
81 public function fooAction()
83 // переход к другому действию в текущем контроллере и модуле:
84 $this->_forward('bar', null, null, array('baz' => 'bogus'));
87 public function barAction()
89 // переход к действию в другом контроллере FooController::bazAction()
91 $this->_forward('baz', 'foo', null, array('baz' => 'bogus'));
94 public function bazAction()
96 // переход к действию в другом контроллере в другом модуле
97 // Foo_BarController::bazAction():
98 $this->_forward('baz', 'bar', 'foo', array('baz' => 'bogus'));
103 <sect2 id="zend.controller.dispatcher.subclassing">
104 <title>Создание подклассов диспетчера</title>
107 <classname>Zend_Controller_Front</classname> сначала вызывает
108 маршрутизатор для получения первого действия в запросе. Затем он
109 входит в цикл диспетчеризации, в котором вызывается диспетчер для
114 Диспетчеру для своей работы требуются различные данные - ему нужно
115 "знать", как формировать имена контроллеров
116 и действий, где искать файлы классов контроллеров, является ли
117 допустимым или нет предоставленное имя модуля, и API для
118 определения на основе другой доступной информации того, возможна
119 ли диспетчеризация данного запроса.
123 <classname>Zend_Controller_Dispatcher_Interface</classname> определяет
124 следующие методы, которые требуется использовать во всех реализациях
128 <programlisting language="php"><![CDATA[
129 interface Zend_Controller_Dispatcher_Interface
132 * Формирует из данной строки имя класса контроллера.
134 * @param string $unformatted
137 public function formatControllerName($unformatted);
140 * Формирует из данной строки имя метода действия.
142 * @param string $unformatted
145 public function formatActionName($unformatted);
148 * Определяет, доступен ли для диспетчеризации запрос
150 * @param Zend_Controller_Request_Abstract $request
153 public function isDispatchable(Zend_Controller_Request_Abstract $request);
156 * Устанавливает пользовательский параметр
157 * (через фронт-контроллер или для локального использования)
159 * @param string $name
160 * @param mixed $value
161 * @return Zend_Controller_Dispatcher_Interface
163 public function setParam($name, $value);
166 * Устанавливает массив пользовательских параметров
168 * @param array $params
169 * @return Zend_Controller_Dispatcher_Interface
171 public function setParams(array $params);
174 * Возвращает один пользовательский параметр
176 * @param string $name
179 public function getParam($name);
182 * Возвращает все пользовательские параметры
186 public function getParams();
189 * Очищает весь стек пользовательских параметров
190 * или удаляет один пользовательский параметр
192 * @param null|string|array один ключ или массив ключей для удаления
193 * @return Zend_Controller_Dispatcher_Interface
195 public function clearParams($name = null);
198 * Устанавливает объект ответа для использования, если есть
200 * @param Zend_Controller_Response_Abstract|null $response
203 public function setResponse(Zend_Controller_Response_Abstract $response = null);
206 * Возвращает объект ответа, если есть
208 * @return Zend_Controller_Response_Abstract|null
210 public function getResponse();
213 * Добавляет директорию в стек директорий контроллеров
215 * @param string $path
216 * @param string $args
217 * @return Zend_Controller_Dispatcher_Interface
219 public function addControllerDirectory($path, $args = null);
222 * Устанавливает директорию(-ии), в которой хранятся файлы контроллеров
224 * @param string|array $dir
225 * @return Zend_Controller_Dispatcher_Interface
227 public function setControllerDirectory($path);
230 * Возвращает установленную в данное время директорию(-ии) для поиска
231 * файлов контроллеров
235 public function getControllerDirectory();
238 * Направляет запрос (модулю/)контроллеру/действию.
240 * @param Zend_Controller_Request_Abstract $request
241 * @param Zend_Controller_Response_Abstract $response
242 * @return Zend_Controller_Request_Abstract|boolean
244 public function dispatch(Zend_Controller_Request_Abstract $request, Zend_Controller_Response_Abstract $response);
247 * Валиден или нет данный модуль
249 * @param string $module
252 public function isValidModule($module);
255 * Возвращает используемое по умолчанию имя модуля
259 public function getDefaultModule();
262 * Возвращает используемое по умолчанию имя контроллера
266 public function getDefaultControllerName();
269 * Возвращает имя используемого по умолчанию действия
273 public function getDefaultAction();
278 Однако в большинстве случаев вам достаточно будет только расширить
279 абстрактный класс <classname>Zend_Controller_Dispatcher_Abstract</classname>,
280 в котором уже определены все эти методы или класс
281 <classname>Zend_Controller_Dispatcher_Standard</classname> для изменения
282 функционала стандартного диспетчера.
286 Основаниями для создания подклассов диспетчера могут быть
287 желание использовать иную схему именования в своих контроллерах
288 действий, либо другую парадигму диспетчеризации -
289 например, файлы действий в директориях контроллеров вместо методов
290 действий в классах контроллеров.