Zend_Controller-Migration.xml 34 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <!-- EN-Revision: 15103 -->
  3. <!-- Reviewed: no -->
  4. <sect1 id="zend.controller.migration">
  5. <title>Migrer depuis des versions précédentes</title>
  6. <para>
  7. L'API des composants MVC a changé plusieurs fois. Si vous avez débuté avec des
  8. versions antérieures de Zend Framework, suivez les recommandations suivantes pour migrer
  9. vos scripts afin d'utiliser la nouvelle architecture.
  10. </para>
  11. <sect2 id="zend.controller.migration.fromonesixtooneseven">
  12. <title>Migrer de la version 1.6.x vers 1.7.0 ou plus récent</title>
  13. <sect3 id="zend.controller.migration.fromonesixtooneseven.dispatcher">
  14. <title>Changement dans l'interface Dispatcher</title>
  15. <para>
  16. Les utilisateurs ont portés l'attention sur le fait que
  17. <classname>Zend_Controller_Action_Helper_ViewRenderer</classname> utilisait une
  18. méthode de la classe abstraite du distributeur standard qui n'était pas présente
  19. dans l'interface Dispatcher.La méthode suivante a donc été ajoutée pour s'assurer
  20. que les distributeurs personnalisés continueront à fonctionner avec les
  21. implémentations embarquées&#160;:
  22. </para>
  23. <itemizedlist>
  24. <listitem>
  25. <para>
  26. <code>formatModuleName()</code>&#160;: devrait être utilisé pour prendre
  27. un nom de contrôleur brut, comme un qui aurait été embarqué dans un objet
  28. requête, et pour le formater en un nom de classe approprié qu'une classe
  29. étendant <classname>Zend_Controller_Action</classname> pourra
  30. utiliser.
  31. </para>
  32. </listitem>
  33. </itemizedlist>
  34. </sect3>
  35. </sect2>
  36. <sect2 id="zend.controller.migration.fromoneohtoonesix">
  37. <title>Migrer de la version 1.5.x vers 1.6.0 ou plus récent</title>
  38. <sect3 id="zend.controller.migration.fromoneohtoonesix.dispatcher">
  39. <title>Changement dans l'interface Dispatcher</title>
  40. <para>
  41. Les utilisateurs ont porté à notre connaissance le fait que
  42. <classname>Zend_Controller_Front</classname> et
  43. <classname>Zend_Controller_Router_Route_Module</classname> utilisent tous les deux
  44. des méthodes du distributeur qui ne sont pas dans l'interface associée. Nous avons
  45. donc ajouté les trois méthodes suivantes pour s'assurer que les distributeurs
  46. personnalisés continueront à fonctionner avec les implémentations embarquées&#160;:
  47. </para>
  48. <itemizedlist>
  49. <listitem>
  50. <para>
  51. <code>getDefaultModule()</code>&#160;: retourne le nom du module par
  52. défaut.
  53. </para>
  54. </listitem>
  55. <listitem>
  56. <para>
  57. <code>getDefaultControllerName()</code>&#160;: retourne le nom du
  58. contrôleur par défaut.
  59. </para>
  60. </listitem>
  61. <listitem>
  62. <para>
  63. <code>getDefaultAction()</code>&#160;: retourne le nom de l'action par
  64. défaut.
  65. </para>
  66. </listitem>
  67. </itemizedlist>
  68. </sect3>
  69. </sect2>
  70. <sect2 id="zend.controller.migration.fromoneohtoonefive">
  71. <title>Migrer de la version 1.0.x vers 1.5.0 ou plus récent</title>
  72. <para>
  73. Bien que la plupart des fonctionnalités de base demeurent les mêmes, et que
  74. toutes les fonctionnalités documentées restent les mêmes, il existe une
  75. "fonctionnalité" particulière <emphasis>non documentée</emphasis> qui a changé.
  76. </para>
  77. <para>
  78. Quand vous écrivez des URLs, la manière documentée d'écrire les noms d'action en
  79. notationCamel est d'utiliser un séparateur de mot ; ceux ci sont "." ou "-" par défaut,
  80. mais ils peuvent être configurés dans le distributeur. Le distributeur en interne
  81. transforme les noms d'action en minuscules, et utilise ces séparateurs de mots pour
  82. ré-assembler la méthode d'action en utilisant la notationCamel. Cependant, comme les
  83. fonctions PHP ne sont pas sensibles à la casse, vous <emphasis>pouvez</emphasis>
  84. toujours écrire les URLs en utilisant la notationCamel, et le distributeur les résoudra
  85. de la même manière. Par exemple, "notation-camel" deviendra "notationCamelAction" dans
  86. le distributeur, tandis que "notationCamel" deviendra "notationcamelAction" ;
  87. cependant, à cause de l'insensibilité à la casse de PHP, dans les deux cas cela
  88. exécutera la même méthode.
  89. </para>
  90. <para>
  91. Ceci pose des problèmes avec le <code>ViewRenderer</code> lors de la résolution
  92. des scripts de vue. La manière canonique et documentée est que tous les séparateurs de
  93. mot sont convertis en tirets, et les mots en minuscules. Ceci crée un lien sémantique
  94. entre les actions et les scripts de vue, et la normalisation s'assure que les scripts
  95. peuvent être trouvés. Cependant, si l'action "notationCamel" est appelée et est
  96. résolue, le séparateur de mot n'est pas pour autant présent, et le
  97. <code>ViewRenderer</code> tente de résoudre un emplacement différent -
  98. "notationcamel.phtml" au lieu de "notation-camel.phtml".
  99. </para>
  100. <para>
  101. Quelques développeurs se sont fondés sur ce "dispositif", qui n'a jamais été
  102. prévu. Plusieurs changements de l'arbre 1.5.0, cependant, l'ont fait de sorte que le
  103. <code>ViewRenderer</code> ne résout plus ces chemins&#160;; le lien sémantique est
  104. maintenant imposé. A partir de maintenant, le distributeur impose la sensibilité à la
  105. casse dans les noms d'action. Ceci veut dire que la référence vers vos actions dans
  106. l'URL en utilisant la notationCamel ne résoudra plus les mêmes méthodes qu'en utilisant
  107. les séparateurs de mots (par ex., "notation-camel"). Ceci entraîne qu'à partir de
  108. maintenant le <code>ViewRenderer</code> honorera seulement les actions en
  109. "mots-séparés" lors de la résolution des scripts de vue.
  110. </para>
  111. <para>
  112. Si vous constatez que vous comptiez sur ce "dispositif", vous avez plusieurs
  113. options&#160;:
  114. </para>
  115. <itemizedlist>
  116. <listitem>
  117. <para>
  118. Meilleure option : renommez vos scripts de vue. Pour&#160;: compatibilité
  119. ascendante. Contre&#160;: si vous avez beaucoup de scripts de vue basés sur
  120. l'ancien, comportement fortuit, vous aurez beaucoup de renommage à
  121. faire.
  122. </para>
  123. </listitem>
  124. <listitem>
  125. <para>
  126. Seconde meilleure option&#160;: le <code>ViewRenderer</code> délégue
  127. maintenant la résolution des scripts de vue à
  128. <classname>Zend_Filter_Inflector</classname> ; vous pouvez modifier les règles
  129. de l'inflecteur pour ne plus séparer les mots d'une action avec un tiret&#160;:
  130. </para>
  131. <programlisting role="php"><![CDATA[
  132. $viewRenderer =
  133. Zend_Controller_Action_HelperBroker::getStaticHelper('viewRenderer');
  134. $inflector = $viewRenderer->getInflector();
  135. $inflector->setFilterRule(':action', array(
  136. new Zend_Filter_PregReplace(
  137. '#[^a-z0-9' . preg_quote(DIRECTORY_SEPARATOR, '#') . ']+#i',
  138. ''
  139. ),
  140. 'StringToLower'
  141. ));
  142. ]]></programlisting>
  143. <para>
  144. Le code ci-dessus modifiera l'inflecteur pour ne plus séparer les mots
  145. avec un tiret&#160;; vous pouvez aussi vouloir supprimer le filtre
  146. <code>StringToLower</code> si vous <emphasis>voulez</emphasis> que vos scripts
  147. de vues utilisent aussi la notationCamel.
  148. </para>
  149. <para>
  150. Si le renommage de vos scripts de vue est trop fastidieux ou nécessite
  151. trop de temps, ceci est la meilleure option avant de trouver le temps de le
  152. faire.
  153. </para>
  154. </listitem>
  155. <listitem>
  156. <para>
  157. Option la moins souhaitable&#160;: vous pouvez forcer le distributeur à
  158. distribuer les noms d'action écrits en notationCamel avec un nouveau drapeau du
  159. contrôleur frontal, <code>useCaseSensitiveActions</code>&#160;:
  160. </para>
  161. <programlisting role="php"><![CDATA[
  162. $front->setParam('useCaseSensitiveActions', true);
  163. ]]></programlisting>
  164. <para>
  165. Ceci vous permettra d'utiliser la notationCamel dans l'URL et de toujours
  166. faire résoudre la même action que si vous utilisez les séparateurs de mots.
  167. Cependant, ceci signifiera que les problèmes décrits ci-dessus interviendront
  168. tôt ou tard ; vous devrez probablement utiliser la deuxième option ci-dessus en
  169. plus de celle-ci pour que tout fonctionne correctement.
  170. </para>
  171. <para>
  172. Notez, de plus, que l'utilisation de ce drapeau déclenchera une
  173. <code>notice</code> indiquant que cette utilisation est dépréciée.
  174. </para>
  175. </listitem>
  176. </itemizedlist>
  177. </sect2>
  178. <sect2 id="zend.controller.migration.fromzeroninethree">
  179. <title>Migrer de la version 0.9.3 vers 1.0.0RC1 ou plus récent</title>
  180. <para>
  181. Les principaux changements introduits dans la version 1.0.0RC1 sont l'ajout et
  182. l'activation par défaut du plugin
  183. <link linkend="zend.controller.plugins.standard.errorhandler">ErrorHandler</link>et de
  184. l'aide d'action
  185. <link linkend="zend.controller.actionhelpers.viewrenderer">ViewRenderer</link>.
  186. Veuillez lire la documentation de chacun des éléments directement pour apprendre leur
  187. fonctionnement et quels effets, ils peuvent avoir sur vos applications.
  188. </para>
  189. <para>
  190. Le plugin <code>ErrorHandler</code> est exécuté pendant
  191. <code>postDispatch()</code> vérifiant la présence d'exceptions, et redirigeant vers le
  192. contrôleur de gestion d'erreur spécifié. Vous pouvez le désactiver en réglant le
  193. paramètre <code>noErrorHandler</code> du contrôleur frontal&#160;:
  194. </para>
  195. <programlisting role="php"><![CDATA[
  196. $front->setParam('noErrorHandler', true);
  197. ]]></programlisting>
  198. <para>
  199. L'aide d'action <code>ViewRenderer</code> automatise l'injection de vues dans les
  200. contrôleurs d'action en tant qu'autogénération des scripts de vues suivant l'action
  201. courante. Le principal problème que vous pourriez rencontrer intervient quand vous avez
  202. des actions qui ne rendent pas de scripts de vues ni ne font suivre ou redirige, alors
  203. <code>ViewRenderer</code> va tenter de rendre un script de vue basé sur le nom de
  204. l'action.
  205. </para>
  206. <para>
  207. Il existe plusieurs possibilités pour mettre à jour votre code. Dans un premier
  208. temps, vous pouvez globalement désactiver <code>ViewRenderer</code> dans votre fichier
  209. d'amorçage du contrôleur frontal avant toute distribution&#160;:
  210. </para>
  211. <programlisting role="php"><![CDATA[
  212. // En considérant que $front est une instance de Zend_Controller_Front
  213. $front->setParam('noViewRenderer', true);
  214. ]]></programlisting>
  215. <para>
  216. Cependant, ceci n'est pas une bonne stratégie à long terme, car il apparaît
  217. aisément que vous devrez écrire plus de code.
  218. </para>
  219. <para>
  220. Quand vous serez prêt à utiliser la fonctionnalité <code>ViewRenderer</code>, il
  221. y a plusieurs choses à vérifier dans votre code de contrôleur. Premièrement, regardez
  222. vos méthodes d'actions (les méthodes se terminant par "Action"), et déterminez ce que
  223. chacune d'elle réalise. Si rien de ce qui suit n'est réalisé, vous devrez réaliser des
  224. changements&#160;:
  225. </para>
  226. <itemizedlist>
  227. <listitem>
  228. <para>Appel de <code>$this-&gt;render()</code></para>
  229. </listitem>
  230. <listitem>
  231. <para>Appel de <code>$this-&gt;_forward()</code></para>
  232. </listitem>
  233. <listitem>
  234. <para>Appel de <code>$this-&gt;_redirect()</code></para>
  235. </listitem>
  236. <listitem>
  237. <para>Appel de l'aide d'action <code>Redirector</code></para>
  238. </listitem>
  239. </itemizedlist>
  240. <para>
  241. Le changement le plus simple est la désactivation de l'auto-rendu pour cette
  242. méthode&#160;:
  243. </para>
  244. <programlisting role="php"><![CDATA[
  245. $this->_helper->viewRenderer->setNoRender();
  246. ]]></programlisting>
  247. <para>
  248. Si vous trouvez qu'aucune de vos méthodes d'actions n'effectue de rendu, ne font
  249. suivre, ou redirige, vous pouvez préférer mettre la ligne suivante dans la méthode
  250. <code>preDispatch()</code> ou <code>init()</code>&#160;:
  251. </para>
  252. <programlisting role="php"><![CDATA[
  253. public function preDispatch()
  254. {
  255. // désactive l'auto-rendu des scripts de vues
  256. $this->_helper->viewRenderer->setNoRender()
  257. // ... faire autre chose ...
  258. }
  259. ]]></programlisting>
  260. <para>
  261. Si vous appelez <code>render()</code>, et que vous utilisez la
  262. <link linkend="zend.controller.modular">structure de dossier modulaire
  263. conventionnelle</link>, vous voudrez modifier votre code pour utiliser
  264. l'auto-rendu&#160;:
  265. </para>
  266. <itemizedlist>
  267. <listitem>
  268. <para>
  269. Si vous rendez de multiples scripts de vues dans une seule action, vous
  270. n'avez rien à modifier.
  271. </para>
  272. </listitem>
  273. <listitem>
  274. <para>
  275. Si vous appelez simplement <code>render()</code> sans aucun argument,
  276. vous pouvez effacer ces lignes.
  277. </para>
  278. </listitem>
  279. <listitem>
  280. <para>
  281. Si vous appelez <code>render()</code> avec des arguments, et que vous ne
  282. réalisez pas ensuite d'exécution de code ou effectuez le rendu de scripts de
  283. vues multiples, vous pouvez changer ces appels par
  284. <code>$this->_helper->viewRenderer()</code>.
  285. </para>
  286. </listitem>
  287. </itemizedlist>
  288. <para>
  289. Si vous n'utilisez pas la structure de dossier modulaire conventionnelle, il
  290. existe une variété de méthodes pour paramétrer le chemin de base des vues et les
  291. spécifications du chemin vers les scripts ainsi vous pourrez utiliser
  292. <code>ViewRenderer</code>. Veuillez lire la
  293. <link linkend="zend.controller.actionhelpers.viewrenderer">documentation de
  294. ViewRenderer</link>pour plus d'informations sur ces méthodes.
  295. </para>
  296. <para>
  297. Si vous utilisez un objet de vue issu du registre, ou que vous personnalisez
  298. votre objet vue, ou que vous utilisez une implémentation de vue différente, vous pouvez
  299. vouloir injecter <code>ViewRenderer</code> dans cet objet. Ceci peut être réalisé
  300. facilement à tout moment.
  301. </para>
  302. <itemizedlist>
  303. <listitem>
  304. <para>Avant la distribution d'une instance de contrôleur frontal&#160;:</para>
  305. <programlisting role="php"><![CDATA[
  306. // En considérant que $view a déjà été définie
  307. $viewRenderer = new Zend_Controller_Action_Helper_ViewRenderer($view);
  308. Zend_Controller_Action_HelperBroker::addHelper($viewRenderer);
  309. ]]></programlisting>
  310. </listitem>
  311. <listitem>
  312. <para>A tout moment durant le processus d'amorçage&#160;:</para>
  313. <programlisting role="php"><![CDATA[
  314. $viewRenderer =
  315. Zend_Controller_Action_HelperBroker::getStaticHelper('viewRenderer');
  316. $viewRenderer->setView($view);
  317. ]]></programlisting>
  318. </listitem>
  319. </itemizedlist>
  320. <para>
  321. Il existe plusieurs manières de modifier <code>ViewRenderer</code>, incluant le
  322. réglage d'un script de vue différent à rendre, la spécification d'un remplaçant pour
  323. tous les éléments remplaçables d'un chemin de script de vues (incluant le suffixe), le
  324. choix d'un segment nommé de la réponse à utiliser, et plus encore. Si vous n'utilisez
  325. pas la structure de dossier modulaire conventionnelle, vous pouvez tout de même
  326. associer différentes spécifications de chemin à <code>ViewRenderer</code>.
  327. </para>
  328. <para>
  329. Nous vous encourageons à adapter votre code pour utiliser
  330. <code>ErrorHandler</code> et <code>ViewRenderer</code> puisqu'il s'agit maintenant de
  331. fonctionnalités natives.
  332. </para>
  333. </sect2>
  334. <sect2 id="zend.controller.migration.fromzeroninetwo">
  335. <title>Migrer de la version 0.9.2 vers 0.9.3 ou plus récent</title>
  336. <para>
  337. 0.9.3 introduit les
  338. <link linkend="zend.controller.actionhelpers">aides d'actions</link>. En lien avec ce
  339. changement, les méthodes suivantes ont été effacées puisqu'elles sont maintenant
  340. encapsulées dans
  341. <link linkend="zend.controller.actionhelpers.redirector">l'aide d'action
  342. redirector</link>&#160;:
  343. </para>
  344. <itemizedlist>
  345. <listitem>
  346. <para>
  347. <code>setRedirectCode()</code> à remplacer par
  348. <classname>Zend_Controller_Action_Helper_Redirector::setCode()</classname>.
  349. </para>
  350. </listitem>
  351. <listitem>
  352. <para>
  353. <code>setRedirectPrependBase()</code> à remplacer par
  354. <classname>Zend_Controller_Action_Helper_Redirector::setPrependBase()</classname>.
  355. </para>
  356. </listitem>
  357. <listitem>
  358. <para>
  359. <code>setRedirectExit()</code> à remplacer par
  360. <classname>Zend_Controller_Action_Helper_Redirector::setExit()</classname>.
  361. </para>
  362. </listitem>
  363. </itemizedlist>
  364. <para>
  365. Lisez la
  366. <link linkend="zend.controller.actionhelpers">documentation des aides
  367. d'actions</link>pour plus d'informations sur la récupération ou la manipulation des
  368. objets "helper", et la
  369. <link linkend="zend.controller.actionhelpers.redirector">documentation du helper
  370. redirector</link>pour plus d'informations sur le réglage des options de redirection (de
  371. même que pour les méthodes alternatives de redirection).
  372. </para>
  373. </sect2>
  374. <sect2 id="zend.controller.migration.fromzerosix">
  375. <title>Migrer de la version 0.6.0 vers 0.8.0 ou plus récent</title>
  376. <para>
  377. Pour les versions précédentes, l'utilisation basique des composants MVC reste la
  378. même&#160;:
  379. </para>
  380. <programlisting role="php"><![CDATA[
  381. Zend_Controller_Front::run('/chemin/vers/controleurs');
  382. ]]></programlisting>
  383. <para>
  384. Cependant, la structure des dossiers a subi une réorganisation, certains
  385. composants ont été effacés, et d'autres ont été soit renommés soit ajoutés. Les
  386. changements incluent&#160;:
  387. </para>
  388. <itemizedlist>
  389. <listitem>
  390. <para>
  391. <classname>Zend_Controller_Router</classname> a été effacé en faveur du
  392. routeur de réécriture ("rewrite router").
  393. </para>
  394. </listitem>
  395. <listitem>
  396. <para>
  397. <classname>Zend_Controller_RewriteRouter</classname> a été renommé en
  398. <classname>Zend_Controller_Router_Rewrite</classname>, et promu en tant que
  399. routeur standard fourni avec le framework ;
  400. <classname>Zend_Controller_Front</classname> l'utilise par défaut si aucun
  401. autre routeur n'est fourni.
  402. </para>
  403. </listitem>
  404. <listitem>
  405. <para>
  406. Une nouvelle classe de route à utiliser avec le routeur de réécriture a
  407. été introduite, <classname>Zend_Controller_Router_Route_Module</classname> ;
  408. elle couvre la route par défaut utilisée par le MVC, et supporte les
  409. <link linkend="zend.controller.modular">modules de contrôleurs</link>.
  410. </para>
  411. </listitem>
  412. <listitem>
  413. <para>
  414. <classname>Zend_Controller_Router_StaticRoute</classname> a été renommé
  415. en <classname>Zend_Controller_Router_Route_Static</classname>.
  416. </para>
  417. </listitem>
  418. <listitem>
  419. <para>
  420. <classname>Zend_Controller_Dispatcher</classname> a été renommé en
  421. <classname>Zend_Controller_Dispatcher_Standard</classname>.
  422. </para>
  423. </listitem>
  424. <listitem>
  425. <para>
  426. Les arguments de
  427. <classname>Zend_Controller_Action::_forward()</classname> ont changés. La
  428. signature est maintenant&#160;:
  429. </para>
  430. <programlisting role="php"><![CDATA[
  431. final protected function _forward($action,
  432. $controller = null,
  433. $module = null,
  434. array $params = null);
  435. ]]></programlisting>
  436. <para>
  437. <code>$action</code> est toujours obligatoire ; si aucun contrôleur n'est
  438. spécifié, une action dans le contrôleur courant est considérée.
  439. <code>$module</code> est toujours ignoré à moins que <code>$controller</code>
  440. ne soit spécifié. Pour finir, tout <code>$params</code> fourni sera ajouté à
  441. l'objet requête. Si aucun contrôleur ou module n'est nécessaire, mais que des
  442. paramètres le sont, passez simplement <code>null</code> pour ces
  443. valeurs.
  444. </para>
  445. </listitem>
  446. </itemizedlist>
  447. </sect2>
  448. <sect2 id="zend.controller.migration.fromzerotwo">
  449. <title>Migrer de la version 0.2.0 ou plus ancien vers 0.6.0</title>
  450. <para>
  451. L'utilisation de base des composants MVC n'a pas changé ; vous pouvez toujours
  452. faire comme suit&#160;:
  453. </para>
  454. <programlisting role="php"><![CDATA[
  455. Zend_Controller_Front::run('/chemin/vers/controleurs');
  456. ]]></programlisting>
  457. <programlisting role="php"><![CDATA[
  458. /* -- créer un routeur -- */
  459. $router = new Zend_Controller_RewriteRouter();
  460. $router->addRoute('user', 'user/:username', array('controller' => 'user',
  461. 'action' => 'info'));
  462. /* -- l'affecter à un contrôleur -- */
  463. $ctrl = Zend_Controller_Front::getInstance();
  464. $ctrl->setRouter($router);
  465. /* -- régler le répertoire des contrôleurs et distribuer -- */
  466. $ctrl->setControllerDirectory('/chemin/vers/controleurs');
  467. $ctrl->dispatch();
  468. ]]></programlisting>
  469. <para>
  470. Nous encourageons l'utilisation de l'objet Réponse pour agréger le contenu et les
  471. en-têtes. Ceci permet un basculement plus flexible entre les formats d'affichage (par
  472. exemple, JSON ou XML au lieu de XHTML) dans vos applications. Par défaut,
  473. <code>dispatch()</code> va effectuer le rendu de la réponse, envoyant à la fois les
  474. en-têtes et tout contenu. Vous pouvez aussi avoir le contrôleur frontal qui retourne la
  475. réponse en utilisant <code>returnResponse()</code>, et qui ensuite effectue le rendu de
  476. la réponse suivant votre propre logique. Une version future du contrôleur frontal peut
  477. mettre en application l'utilisation de l'objet Réponse via la
  478. <ulink url="http://php.net/manual/fr/ref.outcontrol.php">bufferisation de
  479. sortie</ulink>.
  480. </para>
  481. <para>
  482. Il existe beaucoup d'autres fonctionnalités qui étendent l'API existante, et
  483. celles-ci sont décrites dans la documentation.
  484. </para>
  485. <para>
  486. Le changement le plus important auquel vous devrez faire attention apparaîtra
  487. quand vous tenterez de sous-classer les différents composants. La clé se trouve
  488. ci-dessous&#160;:
  489. </para>
  490. <itemizedlist>
  491. <listitem>
  492. <para>
  493. <classname>Zend_Controller_Front::dispatch()</classname> intercepte par
  494. défaut les exceptions dans l'objet réponse, et ne les affiche pas, afin
  495. d'éviter l'affichage d'information sensible du système. Vous pouvez surcharger
  496. ceci de différentes manières&#160;:
  497. </para>
  498. <itemizedlist>
  499. <listitem>
  500. <para>
  501. Régler <code>throwExceptions()</code> dans le contrôleur frontal&#160;:
  502. </para>
  503. <programlisting role="php"><![CDATA[
  504. $front->throwExceptions(true);
  505. ]]></programlisting>
  506. </listitem>
  507. <listitem>
  508. <para>
  509. Régler <code>renderExceptions()</code> dans l'objet Réponse&#160;:
  510. </para>
  511. <programlisting role="php"><![CDATA[
  512. $response->renderExceptions(true);
  513. $front->setResponse($response);
  514. $front->dispatch();
  515. // ou :
  516. $front->returnResponse(true);
  517. $response = $front->dispatch();
  518. $response->renderExceptions(true);
  519. echo $response;
  520. ]]></programlisting>
  521. </listitem>
  522. </itemizedlist>
  523. </listitem>
  524. <listitem>
  525. <para>
  526. <classname>Zend_Controller_Dispatcher_Interface::dispatch()</classname>
  527. accepte maintenant et retourne un objet
  528. <xref linkend="zend.controller.request" /> au lieu d'un élément du
  529. distributeur.
  530. </para>
  531. </listitem>
  532. <listitem>
  533. <para>
  534. <classname>Zend_Controller_Router_Interface::route()</classname> accepte
  535. maintenant et retourne un objet <xref linkend="zend.controller.request" /> au
  536. lieu d'un élément du distributeur.
  537. </para>
  538. </listitem>
  539. <listitem>
  540. <para>
  541. Les changements de <classname>Zend_Controller_Action</classname>
  542. incluent&#160;:
  543. </para>
  544. <itemizedlist>
  545. <listitem>
  546. <para>
  547. Le constructeur accepte maintenant exactement trois arguments,
  548. <classname>Zend_Controller_Request_Abstract $request</classname>,
  549. <classname>Zend_Controller_Response_Abstract $response</classname>, et
  550. le tableau facultatif <code>$params</code>.
  551. <classname>Zend_Controller_Action::__construct()</classname> les
  552. utilise pour affecter la requête, la réponse, et les propriétés
  553. <code>invokeArgs</code> de l'objet, et si vous devez surcharger le
  554. constructeur, vous devez faire de même. La meilleure solution est
  555. d'utiliser la méthode <code>init()</code> pour réaliser toute
  556. configuration de l'instance, puisque cette méthode est appelée en tant
  557. que action finale du constructeur.
  558. </para>
  559. </listitem>
  560. <listitem>
  561. <para>
  562. <code>run()</code> n'est plus défini en tant qu'élément final,
  563. mais n'est pas non plus utilisé par le contrôleur frontal ; son seul
  564. but apparaît lors de l'utilisation de la classe en tant que contrôleur
  565. de page. Il prend maintenant deux arguments facultatifs, un
  566. <classname>Zend_Controller_Request_Abstract $request</classname> et un
  567. <classname>Zend_Controller_Response_Abstract
  568. $response</classname>.
  569. </para>
  570. </listitem>
  571. <listitem>
  572. <para>
  573. <code>indexAction()</code> ne nécessite plus d'être défini, mais
  574. est recommandé en tant qu'action par défaut. Ceci permet lors de
  575. l'utilisation de <code>RewriteRouter</code> et des contrôleurs d'action
  576. de spécifier différentes méthodes d'action par défaut.
  577. </para>
  578. </listitem>
  579. <listitem>
  580. <para>
  581. <code>__call()</code> peut être surchargé pour gérer
  582. automatiquement les actions non définies.
  583. </para>
  584. </listitem>
  585. <listitem>
  586. <para>
  587. <code>_redirect()</code> prend maintenant un second paramètre
  588. facultatif, le code HTTP à retourner avec la redirection, et un
  589. troisième paramètre optionnel, <code>$prependBase</code>, qui peut
  590. indiquer que l'URL de base enregistré avec l'objet requête peut être
  591. ajouté en tant que suffixe à l'URL spécifié.
  592. </para>
  593. </listitem>
  594. <listitem>
  595. <para>
  596. La propriété <code>_action</code> n'existe plus. Cette propriété
  597. était un <classname>Zend_Controller_Dispatcher_Token</classname>, qui
  598. n'existe plus maintenant. Le seul but de cet élément est de fournir
  599. l'information concernant le contrôleur, l'action et les paramètres
  600. d'URL de la requête. Cette information est maintenant disponible dans
  601. l'objet requête, et peut être interrogé comme ceci&#160;:
  602. </para>
  603. <programlisting role="php"><![CDATA[
  604. // Récupère le nom de controleur de la requête
  605. // L'accès se fait via : $this->_action->getControllerName().
  606. // L'exemple ci-dessous utilise getRequest(), bien que vous pourriez
  607. // accéder directement à la propriété $_request ;
  608. // l'utilisation de getRequest() est recommandée puisque la classe
  609. // parente peut surcharger l'accès à l'objet requête.
  610. $controller = $this->getRequest()->getControllerName();
  611. // Recupere le nom de l'action de la requete
  612. // L'acces se fait via : $this->_action->getActionName().
  613. $action = $this->getRequest()->getActionName();
  614. // Recupere les parametres de la requete
  615. // Ceci n'a pas changé ; les méthodes _getParams() et _getParam()
  616. // relaient simplement l'objet requete maintenant.
  617. $params = $this->_getParams();
  618. $foo = $this->_getParam('foo', 'default');
  619. // parametre de la requete 'foo', en utilisant 'default'
  620. // en tant que valeur par défaut si aucune valeur n'est trouvée
  621. ]]></programlisting>
  622. </listitem>
  623. <listitem>
  624. <para>
  625. <code>noRouteAction()</code> a été effacée. La manière appropriée
  626. de gérer les méthodes d'actions non-existantes est de les router vers
  627. une action par défaut en utilisant <code>__call()</code>&#160;:
  628. </para>
  629. <programlisting role="php"><![CDATA[
  630. public function __call($method, $args)
  631. {
  632. // Si la méthode requetee ne correspond a aucune methode 'Action',
  633. // on renvoie vers la méthode d'action par défaut :
  634. if ('Action' == substr($method, -6)) {
  635. return $this->defaultAction();
  636. }
  637. throw new Zend_Controller_Exception('Appel de methode invalide');
  638. }
  639. ]]></programlisting>
  640. </listitem>
  641. </itemizedlist>
  642. </listitem>
  643. <listitem>
  644. <para>
  645. <classname>Zend_Controller_RewriteRouter::setRewriteBase()</classname> a
  646. été effacée. Utilisez plutôt
  647. <classname>Zend_Controller_Front::setBaseUrl()</classname> (ou
  648. Zend_Controller_Request_Http::setBaseUrl(), si vous utilisez cette classe de
  649. requête).
  650. </para>
  651. </listitem>
  652. <listitem>
  653. <para>
  654. <classname>Zend_Controller_Plugin_Interface</classname> a été remplacée
  655. par <classname>Zend_Controller_Plugin_Abstract</classname>. Toutes les méthodes
  656. acceptent et retournent maintenant un objet
  657. <xref linkend="zend.controller.request" /> au lieu d'un élément du
  658. distributeur.
  659. </para>
  660. </listitem>
  661. </itemizedlist>
  662. </sect2>
  663. </sect1>