Zend_Controller-Modular.xml 8.5 KB

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