Zend_Controller-Modular.xml 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229
  1. <sect1 id="zend.controller.modular">
  2. <title>Użycie konwencjonalnej modularnej struktury katalogów</title>
  3. <sect2 id="zend.controller.modular.introduction">
  4. <title>Wprowadzenie</title>
  5. <para>
  6. Konwencjonalna modularna struktura katalogów pozwala ci na
  7. oddzielenie różnych aplikacji MVC w osobne jednostki i użycie ich
  8. z różnymi kontrolerami frontowymi. Przykładem może być taka
  9. struktura katalogów:
  10. </para>
  11. <programlisting role="php"><![CDATA[
  12. docroot/
  13. index.php
  14. application/
  15. default/
  16. controllers/
  17. IndexController.php
  18. FooController.php
  19. models/
  20. views/
  21. scripts/
  22. index/
  23. foo/
  24. helpers/
  25. filters/
  26. blog/
  27. controllers/
  28. IndexController.php
  29. models/
  30. views/
  31. scripts/
  32. index/
  33. helpers/
  34. filters/
  35. news/
  36. controllers/
  37. IndexController.php
  38. ListController.php
  39. models/
  40. views/
  41. scripts/
  42. index/
  43. list/
  44. helpers/
  45. filters/
  46. ]]>
  47. </programlisting>
  48. <para>
  49. W tym modelu, nazwa modułu uwidacznia się jako przedrostek nazw
  50. kontrolerów, ktore zawiera moduł. Powyższy przykład zawiera trzy
  51. kontrolery modułów, 'Blog_IndexController', 'News_IndexController',
  52. oraz 'News_ListController'. Dwa globalne kontrolery, 'IndexController'
  53. oraz 'FooController' są także zdefiniowane; żaden z nich nie posiada
  54. własnej przestrzeni nazw. Ta struktura katalogów będzie używana w
  55. przykładach w tym rozdziale.
  56. </para>
  57. <note>
  58. <title>Brak przestrzeni nazw w domyślnym module</title>
  59. <para>
  60. Zauważ, że w domyślnym module nazwa kontrolera nie ma
  61. przedrostka defniującego przestrzeń nazw. Dlatego w powyższym
  62. przykładzie kontrolery w domyślnym module nie potrzebują
  63. przedrostka 'Default_' -- są one po prostu uruchamiane jako
  64. 'IndexController' oraz 'FooController'. Przedrostek definiujący
  65. przestrzeń nazw jest jednak używany we wszystkich innych
  66. modułach.
  67. </para>
  68. </note>
  69. <para>
  70. Więc jak implementujesz taką strukturę katalogów używając
  71. komponentów MVC Zend Framework?
  72. </para>
  73. </sect2>
  74. <sect2 id="zend.controller.modular.directories">
  75. <title>Określanie ścieżek kontrolera modułów</title>
  76. <para>
  77. Pierwszym krokiem użycia modułów jest zmodyfikowanie sposobu
  78. określania listy ścieżek do kontrolerów w kontrolerze frontowym.
  79. W podstawowej wersji MVC, przekazujesz tablicę lub łańcuch znaków
  80. do metody <code>setControllerDirectory()</code>, lub ścieżkę do
  81. metody <code>addControllerDirectory()</code>. Gdy używasz modułów,
  82. musisz także odpowiednio zmienić wywołania tych metod.
  83. </para>
  84. <para>
  85. W metodzie <code>setControllerDirectory()</code>, musisz przekazać
  86. tablicę asocjacyjną i określić pary klucz/wartość w postaci
  87. moduł/ścieżka. Specjalny klucz <code>default</code> będzie użyty dla
  88. globalnych kontrolerów (tych, które nie potrzebują przestrzeni nazw).
  89. Wszystkie wpisy powinny zawierać łańcuch znaków wskazujący na
  90. pojedynczą ścieżkę, a klucz <code>default</code> musi istnieć. Na
  91. przykład:
  92. </para>
  93. <programlisting role="php"><![CDATA[
  94. $front->setControllerDirectory(array(
  95. 'default' => '/path/to/application/controllers',
  96. 'blog' => '/path/to/application/blog/controllers'
  97. ));
  98. ]]>
  99. </programlisting>
  100. <para>
  101. Metoda <code>addControllerDirectory()</code> przyjmuje opcjonalny
  102. drugi argument. Gdy używasz modułów, przekaż nazwę modułu jak drugi
  103. argument; jeśli nie określisz drugiego argumentu, ścieżka zostanie
  104. dodana dla domyślnej przestrzeni nazw. Na przykład:
  105. </para>
  106. <programlisting role="php"><![CDATA[
  107. $front->addControllerDirectory('/path/to/application/news/controllers', 'news');
  108. ]]>
  109. </programlisting>
  110. <para>
  111. Zostawiając najlepsze na koniec, najprostszym sposobem określenia
  112. katalogu modułów jest określenie ich wszystkich na raz, gdy
  113. wszystkie moduły znajdują się w jednym katalogu i posiadają taką
  114. samą strukturę. Można to zrobić za pomocą metody
  115. <code>addModuleDirectory()</code>:
  116. </para>
  117. <programlisting role="php"><![CDATA[
  118. /**
  119. * Zakładając, że tak wygląda struktura katalogów:
  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. ]]>
  131. </programlisting>
  132. <para>
  133. Powyższy przykład definiuje moduły <code>default</code>,
  134. <code>foo</code>, oraz <code>bar</code>, każdy wskazujący na
  135. podkatalog <code>controllers</code> danego modułu.
  136. </para>
  137. <para>
  138. Możesz określić nazwę podkatalogu kontrolerów używaną w modułach
  139. za pomocą metody <code>setModuleControllerDirectoryName()</code>:
  140. </para>
  141. <programlisting role="php"><![CDATA[
  142. /**
  143. * Zmieniamy nazwę podkatalogu kontrolerów na '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. ]]>
  156. </programlisting>
  157. <note><para>
  158. Możesz określić aby podkatalog kontrolerów nie był używany w
  159. modułach, przekazując pustą wartość do metody
  160. <code>setModuleControllerDirectoryName()</code>.
  161. </para></note>
  162. </sect2>
  163. <sect2 id="zend.controller.modular.router">
  164. <title>Dopasowanie tras do modułów</title>
  165. <para>
  166. Domyślna trasa w
  167. <code>Zend_Controller_Router_Rewrite</code> jest obiektem typu
  168. <code>Zend_Controller_Router_Route_Module</code>. Ta trasa obsługuje
  169. takie schematy routingu:
  170. </para>
  171. <itemizedlist>
  172. <listitem><para><code>:module/:controller/:action/*</code></para></listitem>
  173. <listitem><para><code>:controller/:action/*</code></para></listitem>
  174. </itemizedlist>
  175. <para>
  176. Innymi słowy, dopasuje ona tylko kontroler oraz akcję, lub wraz
  177. z poprzedzającym je modułem. Zasady dopasowania określają, że
  178. moduł będzie dopasowany tylko wtedy, gdy klucz o takiej samej nazwie
  179. istnieje w tablicy ze ścieżkami kontrolerów przekazanej do kontrolera
  180. frontowego i obiektu uruchamiającego.
  181. </para>
  182. </sect2>
  183. <sect2 id="zend.controller.modular.defaultcontroller">
  184. <title>Moduł lub globalny domyślny kontroler</title>
  185. <para>
  186. W domyślnym routerze jeśli w URL nie został określony kontroler,
  187. użyty zostanie domyślny kontroler (<code>IndexController</code>,
  188. jeśli nie określono inaczej). Gdy używamy kontrolerów modularnych,
  189. jeśli moduł został określony, ale kontroler nie, obiekt
  190. uruchamiający wpierw będzie szukał domyślnego kontrolera w ścieżce
  191. modułu, a w drugiej kolejności będzie szukał w ścieżce dla domyślnej
  192. globalnej przestrzeni nazw 'default'.
  193. </para>
  194. <para>
  195. Jeśli chcesz zawsze używać domyślnej przestrzeni nazw, ustaw
  196. parametr <code>useDefaultControllerAlways</code> w kontrolerze frontowym:
  197. </para>
  198. <programlisting role="php"><![CDATA[
  199. $front->setParam('useDefaultControllerAlways', true);
  200. ]]>
  201. </programlisting>
  202. </sect2>
  203. </sect1>