[ZF-10089] Zend_Log
[zend.git] / documentation / manual / ru / module_specs / Zend_Controller-Modular.xml
blobba50fd2ba9b593ae1144d0c8805bf861eb1695a2
1 <?xml version="1.0" encoding="UTF-8"?>
2 <!-- Reviewed: no -->
3 <sect1 id="zend.controller.modular">
4     <title>Использование модульной структуры директорий</title>
6     <sect2 id="zend.controller.modular.introduction">
7         <title>Введение</title>
8         <para>
9             Определенная соглашением модульная структура директорий позволяет
10             разделять различные приложения MVC в автономные единицы и повторно
11             использовать их с различными фронт-контроллерами. Ниже показан
12             пример такой структуры:
13         </para>
15         <programlisting language="txt"><![CDATA[
16 docroot/
17     index.php
18 application/
19     default/
20         controllers/
21             IndexController.php
22             FooController.php
23         models/
24         views/
25             scripts/
26                 index/
27                 foo/
28             helpers/
29             filters/
30     blog/
31         controllers/
32             IndexController.php
33         models/
34         views/
35             scripts/
36                 index/
37             helpers/
38             filters/
39     news/
40         controllers/
41             IndexController.php
42             ListController.php
43         models/
44         views/
45             scripts/
46                 index/
47                 list/
48             helpers/
49             filters/
50 ]]></programlisting>
52         <para>
53             В этой парадигме имена модулей используются как префиксы к
54             контроллерам в этих модулях. Пример выше содержит три контроллера в
55             модулях: 'Blog_IndexController', 'News_IndexController' и
56             'News_ListController'. Также определены два глобальных контроллера:
57             'IndexController' и 'FooController', для них не используются
58             пространства имен. Эта структура директорий будет
59             использоваться для примеров в данном разделе.
60         </para>
62         <note>
63             <title>Нет пространств имен в модуле, используемом по умолчанию</title>
64             <para>
65                 Обратите внимание, что в модуле, используемом по умолчанию,
66                 контролеры не нуждаются в префиксе пространства имен. В примере
67                 выше контроллеры в модуле по умолчанию не нуждаются в префиксе
68                 'Default_' - они просто вызываются по их базовым именам
69                 контроллера: 'IndexController' and 'FooController'. Но для
70                 других модулей использование префикса пространства имен
71                 обязательно.
72             </para>
73         </note>
75         <para>
76             Итак, как можно реализовать такую организацию на уровне директорий,
77             используя компоненты MVC в Zend Framework?
78         </para>
79     </sect2>
81     <sect2 id="zend.controller.modular.directories">
82         <title>Определение директорий контроллеров в модулях</title>
84         <para>
85             Первым шагом в использовании модулей является изменение способа
86             определения списка директорий во фронт-контроллере. При обычном
87             использовании MVC вы передаете массив или строку методу
88             <code>setControllerDirectory()</code>, либо путь методу
89             <code>addControllerDirectory()</code>. В случае использования
90             модулей нужно несколько изменить вызовы этих методов.
91         </para>
93         <para>
94             Методу <code>setControllerDirectory()</code> должен передаваться
95             ассоциативный массив, в котором пары ключ/значение содержат имя
96             модуля и путь к директории соответственно. Специальный ключ
97             'default' используется для глобальных контроллеров (которым не нужно
98             пространство имен модуля). Все записи должны содержать строковой
99             ключ, указывающий на единственный путь, при этом должен
100             присутствовать ключ <code>default</code>. Например:
101         </para>
103         <programlisting language="php"><![CDATA[
104 $front->setControllerDirectory(array(
105       'default' => '/path/to/application/controllers',
106       'blog'    => '/path/to/application/blog/controllers'
108 ]]></programlisting>
110         <para>
111             Метод <code>addControllerDirectory()</code> принимает необязательный
112             второй параметр. Если используются модули, то передавайте имя модуля
113             в качестве второго аргумента; если он не определен, то путь будет
114             добавлен в пространство имен <code>default</code>. Например:
115         </para>
117         <programlisting language="php"><![CDATA[
118 $front->addControllerDirectory('/path/to/application/news/controllers',
119                                'news');
120 ]]></programlisting>
122         <para>
123             Лучшее напоследок: самый легкий способ определения
124             директорий модулей состоит в их одновременном определении, со всеми
125             модулями под общей директорией и использующими одну и ту же
126             структуру. Это может быть сделано с помощью
127             <code>addModuleDirectory()</code>:
128         </para>
130         <programlisting language="php"><![CDATA[
132  * Предполагается следующая структура директорий:
133  * application/
134  *     modules/
135  *         default/
136  *             controllers/
137  *         foo/
138  *             controllers/
139  *         bar/
140  *             controllers/
141  */
142 $front->addModuleDirectory('/path/to/application/modules');
143 ]]></programlisting>
145         <para>
146             Пример выше определит модули <code>default</code>, <code>foo</code>
147             и <code>bar</code>, все они указывают на поддиректорию
148             <code>controllers</code> соответствующих модулей.
149         </para>
151         <para>
152             Через метод <code>setModuleControllerDirectoryName() можно указать
153             другую поддиректорию контроллеров для использования внутри
154             модулей</code>:
155         </para>
157         <programlisting language="php"><![CDATA[
159  * Изменяем поддиректорию для контроллеров на 'con'
160  * application/
161  *     modules/
162  *         default/
163  *             con/
164  *         foo/
165  *             con/
166  *         bar/
167  *             con/
168  */
169 $front->setModuleControllerDirectoryName('con');
170 $front->addModuleDirectory('/path/to/application/modules');
171 ]]></programlisting>
173         <note><para>
174             Вы можете указать, что для модулей не должна использоваться
175             поддиректория для контроллеров путем передачи пустого значения
176             методу <code>setModuleControllerDirectoryName()</code>.
177         </para></note>
178     </sect2>
180     <sect2 id="zend.controller.modular.router">
181         <title>Маршрутизация применительно к модулям</title>
183         <para>
184             Маршрут, используемый по умолчанию в
185             <classname>Zend_Controller_Router_Rewrite</classname>, является объектом типа
186             <classname>Zend_Controller_Router_Route_Module</classname>. Этот маршрут
187             использует один из следующих шаблонов маршрутизации:
188         </para>
190         <itemizedlist>
191             <listitem><para>
192                 <code>:module/:controller/:action/*</code>
193             </para></listitem>
194             <listitem><para>
195                 <code>:controller/:action/*</code>
196             </para></listitem>
197         </itemizedlist>
199         <para>
200             Другими словами, он будет соответсвовать контроллеру и действию без
201             модуля или контроллеру и действию с предшествующим модулем. Правила
202             сопоставления предписывают, что URL должен только тогда
203             соответствовать модулю, если ключ с тем же именем существует в
204             массиве директорий контроллеров, переданного фронт-контроллеру и
205             диспетчеру.
206         </para>
207     </sect2>
209     <sect2 id="zend.controller.modular.defaultcontroller">
210         <title>Модуль или глобальный контроллер по умолчанию</title>
212         <para>
213             В маршрутизаторе, используемом по умолчанию, если контроллер не был
214             указан в URL, то используется контроллер по умолчанию
215             (<code>IndexController</code>, если не был установлен другой). В
216             случае использования модулей, если был указан модуль без
217             контроллера, то диспетчер сначала ищет используемый по умолчанию
218             контроллер в директории модуля, затем в глобальном пространстве имен
219             'default'.
220         </para>
222         <para>
223             Если требуется всегда использовать глобальное пространство имен, то
224             установите параметр <code>useGlobalDefault</code> во
225             фронт-контроллере:
226         </para>
228         <programlisting language="php"><![CDATA[
229 $front->setParam('useDefaultControllerAlways', true);
230 ]]></programlisting>
231     </sect2>
232 </sect1>
233 <!--
234 vim:se ts=4 sw=4 et: