1 <?xml version="1.0" encoding="UTF-8"?>
3 <sect1 id="zend.controller.modular">
4 <title>Использование модульной структуры директорий</title>
6 <sect2 id="zend.controller.modular.introduction">
7 <title>Введение</title>
9 Определенная соглашением модульная структура директорий позволяет
10 разделять различные приложения MVC в автономные единицы и повторно
11 использовать их с различными фронт-контроллерами. Ниже показан
12 пример такой структуры:
15 <programlisting language="txt"><![CDATA[
53 В этой парадигме имена модулей используются как префиксы к
54 контроллерам в этих модулях. Пример выше содержит три контроллера в
55 модулях: 'Blog_IndexController', 'News_IndexController' и
56 'News_ListController'. Также определены два глобальных контроллера:
57 'IndexController' и 'FooController', для них не используются
58 пространства имен. Эта структура директорий будет
59 использоваться для примеров в данном разделе.
63 <title>Нет пространств имен в модуле, используемом по умолчанию</title>
65 Обратите внимание, что в модуле, используемом по умолчанию,
66 контролеры не нуждаются в префиксе пространства имен. В примере
67 выше контроллеры в модуле по умолчанию не нуждаются в префиксе
68 'Default_' - они просто вызываются по их базовым именам
69 контроллера: 'IndexController' and 'FooController'. Но для
70 других модулей использование префикса пространства имен
76 Итак, как можно реализовать такую организацию на уровне директорий,
77 используя компоненты MVC в Zend Framework?
81 <sect2 id="zend.controller.modular.directories">
82 <title>Определение директорий контроллеров в модулях</title>
85 Первым шагом в использовании модулей является изменение способа
86 определения списка директорий во фронт-контроллере. При обычном
87 использовании MVC вы передаете массив или строку методу
88 <code>setControllerDirectory()</code>, либо путь методу
89 <code>addControllerDirectory()</code>. В случае использования
90 модулей нужно несколько изменить вызовы этих методов.
94 Методу <code>setControllerDirectory()</code> должен передаваться
95 ассоциативный массив, в котором пары ключ/значение содержат имя
96 модуля и путь к директории соответственно. Специальный ключ
97 'default' используется для глобальных контроллеров (которым не нужно
98 пространство имен модуля). Все записи должны содержать строковой
99 ключ, указывающий на единственный путь, при этом должен
100 присутствовать ключ <code>default</code>. Например:
103 <programlisting language="php"><![CDATA[
104 $front->setControllerDirectory(array(
105 'default' => '/path/to/application/controllers',
106 'blog' => '/path/to/application/blog/controllers'
111 Метод <code>addControllerDirectory()</code> принимает необязательный
112 второй параметр. Если используются модули, то передавайте имя модуля
113 в качестве второго аргумента; если он не определен, то путь будет
114 добавлен в пространство имен <code>default</code>. Например:
117 <programlisting language="php"><![CDATA[
118 $front->addControllerDirectory('/path/to/application/news/controllers',
123 Лучшее напоследок: самый легкий способ определения
124 директорий модулей состоит в их одновременном определении, со всеми
125 модулями под общей директорией и использующими одну и ту же
126 структуру. Это может быть сделано с помощью
127 <code>addModuleDirectory()</code>:
130 <programlisting language="php"><![CDATA[
132 * Предполагается следующая структура директорий:
142 $front->addModuleDirectory('/path/to/application/modules');
146 Пример выше определит модули <code>default</code>, <code>foo</code>
147 и <code>bar</code>, все они указывают на поддиректорию
148 <code>controllers</code> соответствующих модулей.
152 Через метод <code>setModuleControllerDirectoryName() можно указать
153 другую поддиректорию контроллеров для использования внутри
157 <programlisting language="php"><![CDATA[
159 * Изменяем поддиректорию для контроллеров на 'con'
169 $front->setModuleControllerDirectoryName('con');
170 $front->addModuleDirectory('/path/to/application/modules');
174 Вы можете указать, что для модулей не должна использоваться
175 поддиректория для контроллеров путем передачи пустого значения
176 методу <code>setModuleControllerDirectoryName()</code>.
180 <sect2 id="zend.controller.modular.router">
181 <title>Маршрутизация применительно к модулям</title>
184 Маршрут, используемый по умолчанию в
185 <classname>Zend_Controller_Router_Rewrite</classname>, является объектом типа
186 <classname>Zend_Controller_Router_Route_Module</classname>. Этот маршрут
187 использует один из следующих шаблонов маршрутизации:
192 <code>:module/:controller/:action/*</code>
195 <code>:controller/:action/*</code>
200 Другими словами, он будет соответсвовать контроллеру и действию без
201 модуля или контроллеру и действию с предшествующим модулем. Правила
202 сопоставления предписывают, что URL должен только тогда
203 соответствовать модулю, если ключ с тем же именем существует в
204 массиве директорий контроллеров, переданного фронт-контроллеру и
209 <sect2 id="zend.controller.modular.defaultcontroller">
210 <title>Модуль или глобальный контроллер по умолчанию</title>
213 В маршрутизаторе, используемом по умолчанию, если контроллер не был
214 указан в URL, то используется контроллер по умолчанию
215 (<code>IndexController</code>, если не был установлен другой). В
216 случае использования модулей, если был указан модуль без
217 контроллера, то диспетчер сначала ищет используемый по умолчанию
218 контроллер в директории модуля, затем в глобальном пространстве имен
223 Если требуется всегда использовать глобальное пространство имен, то
224 установите параметр <code>useGlobalDefault</code> во
228 <programlisting language="php"><![CDATA[
229 $front->setParam('useDefaultControllerAlways', true);