Zend_Controller-Modular.xml 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <!-- EN-Revision: 24249 -->
  3. <!-- Reviewed: no -->
  4. <sect1 id="zend.controller.modular">
  5. <title>Utilisation de conventions de dossiers modulaires</title>
  6. <sect2 id="zend.controller.modular.introduction">
  7. <title>Introduction</title>
  8. <para>
  9. Les conventions de dossiers vous permettent de séparer les différentes
  10. applications <acronym>MVC</acronym> dans des unités isolées et les réutiliser dans le contrôleur frontal.
  11. Voici une illustration&#160;:
  12. </para>
  13. <programlisting language="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. ]]></programlisting>
  49. <para>
  50. Ci dessus, le nom du module est utilisé comme préfixe pour les contrôleurs qu'il
  51. possède. Il y a donc trois contrôleurs&#160;: "Blog_IndexController",
  52. "News_IndexController", et "News_ListController". Deux contrôleurs dans le module par
  53. défaut sont aussi définis, "IndexController" et "FooController". Ceux-ci ne possèdent
  54. pas le nom du module dans leur nom. Cet exemple d'arborescence conseillée sera utilisé
  55. dans ce chapitre.
  56. </para>
  57. <note>
  58. <title>Pas de namespace pour le module par défaut</title>
  59. <para>
  60. Notez que dans le module par défaut, les contrôleurs n'ont pas besoin d'être
  61. préfixés par le nom du module ("Default_"). Ils sont simplement distribués tels
  62. quels. Ce n'est pas le cas pour les autres contrôleurs.
  63. </para>
  64. </note>
  65. <para>Alors, comment utiliser une structure telle que celle-ci&#160;?</para>
  66. </sect2>
  67. <sect2 id="zend.controller.modular.directories">
  68. <title>Spécification des dossiers de modules</title>
  69. <para>
  70. La première chose à faire est d'indiquer au contrôleur frontal où se trouvent les
  71. dossiers contenant les contrôleurs d'action. Passez un <code>array</code> ou une
  72. <code>string</code> à <methodname>setControllerDirectory()</methodname>, ou alors une
  73. <code>string</code> à <methodname>addControllerDirectory()</methodname>. Si vous utilisez les
  74. modules, ces appels de méthodes changent quelque peu.
  75. </para>
  76. <para>
  77. Pour <methodname>setControllerDirectory()</methodname>, un tableau est requis. Les paires
  78. clé/valeur représentent le nom du module, et le chemin des contrôleurs. La clé
  79. <code>default</code> est utilisée pour indiquer les contrôleurs globaux (dont le nom ne
  80. comporte pas le module). Chaque option doit comporter une indication vers un chemin, et
  81. la clé <code>default</code> doit être présente&#160;:
  82. </para>
  83. <programlisting language="php"><![CDATA[
  84. $front->setControllerDirectory(array(
  85. 'default' => '/path/to/application/controllers',
  86. 'blog' => '/path/to/application/blog/controllers'
  87. ));
  88. ]]></programlisting>
  89. <para>
  90. <methodname>addControllerDirectory()</methodname> prend en paramètre une <code>string</code>
  91. décrivant un chemin vers des contrôleurs. Si vous voulez indiquer un module, passez le
  92. en second paramètre. Sinon, le chemin sera ajouté au module
  93. <code>default.</code>
  94. </para>
  95. <programlisting language="php"><![CDATA[
  96. $front->addControllerDirectory('/path/to/application/news/controllers',
  97. 'news');
  98. ]]></programlisting>
  99. <para>
  100. Enfin, si vous avez un dossier spécial regroupant tous vos modules, indiquez le
  101. grâce à <methodname>addModuleDirectory()</methodname>&#160;:
  102. </para>
  103. <programlisting language="php"><![CDATA[
  104. /**
  105. * Sur cet exemple :
  106. * application/
  107. * modules/
  108. * default/
  109. * controllers/
  110. * foo/
  111. * controllers/
  112. * bar/
  113. * controllers/
  114. */
  115. $front->addModuleDirectory('/path/to/application/modules');
  116. ]]></programlisting>
  117. <para>
  118. Dans le code ci dessus, vous déclarez 3 modules en une méthodes. Celle-ci
  119. s'attend à la structure comprenant les modules <code>default</code>, <code>foo</code>,
  120. et <code>bar</code>, chacun devant posséder un dossier <code>controllers</code>
  121. </para>
  122. <para>
  123. Si le dossier "controllers" ne vous convient pas, changez son nom à l'aide de
  124. <methodname>setModuleControllerDirectoryName()</methodname>&#160;:
  125. </para>
  126. <programlisting language="php"><![CDATA[
  127. /**
  128. * Le dossier des contrôleurs s'appelle désormais 'con'
  129. * application/
  130. * modules/
  131. * default/
  132. * con/
  133. * foo/
  134. * con/
  135. * bar/
  136. * con/
  137. */
  138. $front->setModuleControllerDirectoryName('con');
  139. $front->addModuleDirectory('/path/to/application/modules');
  140. ]]></programlisting>
  141. <note>
  142. <para>
  143. Si vos dossiers de modules ne doivent pas utiliser de sous dossier pour les
  144. contrôleurs, alors passez une valeur vide à
  145. <methodname>setModuleControllerDirectoryName()</methodname>.
  146. </para>
  147. </note>
  148. </sect2>
  149. <sect2 id="zend.controller.modular.router">
  150. <title>Routage des modules</title>
  151. <para>
  152. La route par défaut, <classname>Zend_Controller_Router_Rewrite</classname> est un
  153. objet de type <classname>Zend_Controller_Router_Route_Module</classname>. Cette route
  154. traite les schémas de routage suivants&#160;:
  155. </para>
  156. <itemizedlist>
  157. <listitem>
  158. <para><code>:module/:controller/:action/*</code></para>
  159. </listitem>
  160. <listitem>
  161. <para><code>:controller/:action/*</code></para>
  162. </listitem>
  163. </itemizedlist>
  164. <para>
  165. Ainsi, elle va trouver les contrôleurs et actions, avec ou sans module les
  166. précédant. Un module ne sera trouvé que si sa clé existe dans le tableau d'options
  167. passé au contrôleur frontal ou au distributeur.
  168. </para>
  169. </sect2>
  170. <sect2 id="zend.controller.modular.defaultcontroller">
  171. <title>Module ou contrôleur Default global</title>
  172. <para>
  173. Dans le routeur par défaut, si aucun contrôleur n'est indiqué dans l'URL, un
  174. contrôleur par défaut sera utilisé (<code>IndexController</code>, sauf si l'on décide
  175. de changer ce paramètre). Avec des modules indiqués dans l'URL, si aucun contrôleur
  176. n'est indiqué, alors le distributeur cherchera dans le module demandé le contrôleur par
  177. défaut. Si celui-ci est absent, c'est celui du module "default" qui sera
  178. utilisé.
  179. </para>
  180. <para>
  181. Si vous voulez renvoyer directement vers le contrôleur par défaut du module
  182. "default", passez le paramètre <code>useDefaultControllerAlways</code> à
  183. <constant>TRUE</constant> dans le contrôleur frontal&#160;:
  184. </para>
  185. <programlisting language="php"><![CDATA[
  186. $front->setParam('useDefaultControllerAlways', true);
  187. ]]></programlisting>
  188. </sect2>
  189. </sect1>