Zend_Controller-Modular.xml 11 KB

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