Zend_Controller-Modular.xml 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- EN-Revision: 15103 -->
  3. <!-- Reviewed: no -->
  4. <sect1 id="zend.controller.modular">
  5. <title>Eine konventionelle modulare Verzeichnis Struktur verwenden</title>
  6. <sect2 id="zend.controller.modular.introduction">
  7. <title>Einführung</title>
  8. <para>
  9. Eine konventionelle modulare Verzeichnisstruktur erlaubt es verschiedene MVC Anwendungen in
  10. selbst-enthaltene Einheiten zu teilen, und diese mit verschiedenen Front Kontrollern wiederzuverwenden.
  11. Um so eine Verzeichnisstruktur zu zeigen:
  12. </para>
  13. <programlisting role="php"><![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. ]]>
  49. </programlisting>
  50. <para>
  51. In diesem Paradigma arbeitet der Modulname als Prefix für den Kontroller den er enthält. Das obige
  52. Beispiel enthält drei Modul Kontroller, 'Blog_IndexController', 'News_IndexController', und
  53. 'News_ListController'. Zwei gloale Kontroller, 'IndexController' und 'FooController' werden auch
  54. definiert; keiner von diesen ist in einem Namensraum. Diese Verzeichnisstruktur wird für die
  55. Beispiele in diesem Kapitel verwendet.
  56. </para>
  57. <note>
  58. <title>Keine Verwendung von Namensräumen im Standard Modul</title>
  59. <para>
  60. Es ist zu beachten das Kontroller, im Standardmodul, keinen Prefix für den Namensraum benötigen.
  61. Deshalb benötigt der Kontroller, im obigen Beispiel, den Prefix 'Default_' nicht -- sie werden
  62. einfach dispatched gemäß dem Namen des Basis Kontrollers: 'IndexController' und 'FooController'.
  63. Ein Prefix für den Namensraum wird trotzdem in allen anderen Modulen verwendet.
  64. </para>
  65. </note>
  66. <para>
  67. Also, wie kann solch ein Verzeichnislayout mit den MVC Komponenten des Zend Frameworks implementiert
  68. werden?
  69. </para>
  70. </sect2>
  71. <sect2 id="zend.controller.modular.directories">
  72. <title>Verzeichnisse für Modul Kontroller spezifizieren</title>
  73. <para>
  74. Der erste Schritt um Module zu verwenden ist es, die Art der Spezifizierung der Kontroller Verzeichnis
  75. Liste im Front Kontroller, zu Ändern. In der grundsätzlichen MVC Serie, kann entweder ein Array oder
  76. ein String an <code>setControllerDirectory()</code>, oder ein Pfad an
  77. <code>addControllerDirectory()</code> übergeben werden. Wenn Module verwendet werden, müssen die
  78. Aufrufe dieser Methoden leicht geändert werden.
  79. </para>
  80. <para>
  81. Mit <code>setControllerDirectory()</code>, muß ein assoziatives Array übergeben und Schlüssel/Werte
  82. Paare von Modul Namen/Verzeichnis Pfaden übergeben werden. Der spezielle Schlüssel <code>default</code>
  83. wird für globale Kontroller verwenden (diejenigen die keinen Modul Namensraum benötigen). Alle
  84. Einträge sollten einen String Schlüssel enthalten der zu einem einzelnen Pfad zeigt, und der
  85. <code>default</code> Schlüssel muß vorhanden sein. Als Beispiel:
  86. </para>
  87. <programlisting role="php"><![CDATA[
  88. $front->setControllerDirectory(array(
  89. 'default' => '/path/to/application/controllers',
  90. 'blog' => '/path/to/application/blog/controllers'
  91. ));
  92. ]]>
  93. </programlisting>
  94. <para>
  95. <code>addControllerDirectory()</code> nimmt ein optionales zweites Argument. Wenn Module verwendet
  96. werden, kann der Modulname als zweites Argument übergeben werden; wenn nicht spezifiziert, wird der
  97. Pfad zum <code>default</code> Namensraum hinzugefügt. Als Beispiel:
  98. </para>
  99. <programlisting role="php"><![CDATA[
  100. $front->addControllerDirectory('/path/to/application/news/controllers',
  101. 'news');
  102. ]]>
  103. </programlisting>
  104. <para>
  105. Und das beste zum Schluß. Der einfachste Weg um Modul Verzeichnisse zu spezifizieren ist es en masse
  106. zu machen, mit allen Modulen in einem gemeinsamen Verzeichnis und die gleiche Struktur verwendend.
  107. Das kann mit <code>addModuleDirectory()</code> getan werden:
  108. </para>
  109. <programlisting role="php"><![CDATA[
  110. /**
  111. * Nehmen wir die folgende Verzeichnisstruktur an:
  112. * application/
  113. * modules/
  114. * default/
  115. * controllers/
  116. * foo/
  117. * controllers/
  118. * bar/
  119. * controllers/
  120. */
  121. $front->addModuleDirectory('/path/to/application/modules');
  122. ]]>
  123. </programlisting>
  124. <para>
  125. Das obige Beispiel definiert die <code>default</code>, <code>foo</code>, und <code>bar</code> Module,
  126. die alle zum Unterverzeichnis <code>controllers</code> zeigen und zu Ihrem betreffenden Modul.
  127. </para>
  128. <para>
  129. Das Unterverzeichnis für den Kontroller kann angepasst werden um diesen in eigenen Modulen mit
  130. <code>setModuleControllerDirectoryName()</code> verwenden:
  131. </para>
  132. <programlisting role="php"><![CDATA[
  133. /**
  134. * Das Kontroller Unterverzeichnis ändern damit es 'con' ist
  135. * application/
  136. * modules/
  137. * default/
  138. * con/
  139. * foo/
  140. * con/
  141. * bar/
  142. * con/
  143. */
  144. $front->setModuleControllerDirectoryName('con');
  145. $front->addModuleDirectory('/path/to/application/modules');
  146. ]]>
  147. </programlisting>
  148. <note><para>
  149. Man kann angeben das kein Kontroller Unterverzeichnis für die eigenen Module verwendet wird, indem
  150. ein leerer Wert an <code>setModuleControllerDirectoryName()</code> übergeben wird.
  151. </para></note>
  152. </sect2>
  153. <sect2 id="zend.controller.modular.router">
  154. <title>Zu Modulen routen</title>
  155. <para>
  156. Die Standardroute in <classname>Zend_Controller_Router_Rewrite</classname> ist ein Objekt vom Typ
  157. <classname>Zend_Controller_Router_Route_Module</classname>. Diese Route erwartet eines der folgenden
  158. Routing Schemas:
  159. </para>
  160. <itemizedlist>
  161. <listitem><para><code>:module/:controller/:action/*</code></para></listitem>
  162. <listitem><para><code>:controller/:action/*</code></para></listitem>
  163. </itemizedlist>
  164. <para>
  165. In anderen Worten, wird jeder Kontroller und jede Aktion durch sich selbst entsprechen oder mit einem
  166. vorangestellten Modul. Diese Regeln für die Entsprechung spezifizieren, das ein Modul nur dann
  167. entspricht, wenn ein Schlüssel mit dem gleichen Namen im Kontroller Verzeichnis Array existiert, das dem
  168. Front Kontroller und Dispatcher übergeben wird.
  169. </para>
  170. </sect2>
  171. <sect2 id="zend.controller.modular.defaultcontroller">
  172. <title>Modul oder globaler Standard Kontroller</title>
  173. <para>
  174. Im Standardrouter wird der Standardkontroller verwendet (<code>IndexController</code>, solange nicht
  175. anders angefragt), wenn kein Kontroller in der URL spezifiziert wurde. Bei modularen Kontrollern wird
  176. der Dispatcher zuerst für diesen Standardkontroller im Modulpfad nachsehen, wenn ein Modul aber kein
  177. Kontroller spezifiziert wurde, und fällt dann auf den Standardcontroller zurück, der im 'default'
  178. globalen Namensraum gefunden wird.
  179. </para>
  180. <para>
  181. Wenn immer auf den globalen Namensraum zurückgefallen werden soll, muß der
  182. <code>useDefaultControllerAlways</code> im Front Kontroller gesetzt werden:
  183. </para>
  184. <programlisting role="php"><![CDATA[
  185. $front->setParam('useDefaultControllerAlways', true);
  186. ]]>
  187. </programlisting>
  188. </sect2>
  189. </sect1>
  190. <!--
  191. vim:se ts=4 sw=4 et:
  192. -->