Zend_Controller-Modular.xml 8.9 KB

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