migration-06.xml 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- EN-Revision: 24249 -->
  3. <!-- Reviewed: no -->
  4. <sect1 id="migration.06">
  5. <title>Zend Framework 0.6</title>
  6. <para>
  7. Lors de la migration d'un version précédente vers Zend Framework 0.6 ou plus récent
  8. vous devriez prendre note de ce qui suit.
  9. </para>
  10. <sect2 id="migration.06.zend.controller">
  11. <title>Zend_Controller</title>
  12. <para>
  13. L'utilisation de base des composants <acronym>MVC</acronym> n'a pas changé ; vous pouvez toujours
  14. faire comme suit&#160;:
  15. </para>
  16. <programlisting language="php"><![CDATA[
  17. Zend_Controller_Front::run('/chemin/vers/controleurs');
  18. ]]></programlisting>
  19. <programlisting language="php"><![CDATA[
  20. /* -- créer un routeur -- */
  21. $router = new Zend_Controller_RewriteRouter();
  22. $router->addRoute('user', 'user/:username', array('controller' => 'user',
  23. 'action' => 'info'));
  24. /* -- l'affecter à un contrôleur -- */
  25. $ctrl = Zend_Controller_Front::getInstance();
  26. $ctrl->setRouter($router);
  27. /* -- régler le répertoire des contrôleurs et distribuer -- */
  28. $ctrl->setControllerDirectory('/chemin/vers/controleurs');
  29. $ctrl->dispatch();
  30. ]]></programlisting>
  31. <para>
  32. Nous encourageons l'utilisation de l'objet Réponse pour agréger le contenu et les
  33. en-têtes. Ceci permet un basculement plus flexible entre les formats d'affichage (par
  34. exemple, <acronym>JSON</acronym> ou <acronym>XML</acronym> au lieu de <acronym>XHTML</acronym>) dans vos applications. Par défaut,
  35. <methodname>dispatch()</methodname> va effectuer le rendu de la réponse, envoyant à la fois les
  36. en-têtes et tout contenu. Vous pouvez aussi avoir le contrôleur frontal qui retourne la
  37. réponse en utilisant <methodname>returnResponse()</methodname>, et qui ensuite effectue le rendu de
  38. la réponse suivant votre propre logique. Une version future du contrôleur frontal peut
  39. mettre en application l'utilisation de l'objet Réponse via la
  40. <ulink url="http://php.net/manual/fr/ref.outcontrol.php">bufferisation de
  41. sortie</ulink>.
  42. </para>
  43. <para>
  44. Il existe beaucoup d'autres fonctionnalités qui étendent l'API existante, et
  45. celles-ci sont décrites dans la documentation.
  46. </para>
  47. <para>
  48. Le changement le plus important auquel vous devrez faire attention apparaîtra
  49. quand vous tenterez de sous-classer les différents composants. La clé se trouve
  50. ci-dessous&#160;:
  51. </para>
  52. <itemizedlist>
  53. <listitem>
  54. <para>
  55. <methodname>Zend_Controller_Front::dispatch()</methodname> intercepte par
  56. défaut les exceptions dans l'objet réponse, et ne les affiche pas, afin
  57. d'éviter l'affichage d'information sensible du système. Vous pouvez surcharger
  58. ceci de différentes manières&#160;:
  59. </para>
  60. <itemizedlist>
  61. <listitem>
  62. <para>
  63. Régler <methodname>throwExceptions()</methodname> dans le contrôleur frontal&#160;:
  64. </para>
  65. <programlisting language="php"><![CDATA[
  66. $front->throwExceptions(true);
  67. ]]></programlisting>
  68. </listitem>
  69. <listitem>
  70. <para>
  71. Régler <methodname>renderExceptions()</methodname> dans l'objet Réponse&#160;:
  72. </para>
  73. <programlisting language="php"><![CDATA[
  74. $response->renderExceptions(true);
  75. $front->setResponse($response);
  76. $front->dispatch();
  77. // ou :
  78. $front->returnResponse(true);
  79. $response = $front->dispatch();
  80. $response->renderExceptions(true);
  81. echo $response;
  82. ]]></programlisting>
  83. </listitem>
  84. </itemizedlist>
  85. </listitem>
  86. <listitem>
  87. <para>
  88. <methodname>Zend_Controller_Dispatcher_Interface::dispatch()</methodname>
  89. accepte maintenant et retourne un objet
  90. <xref linkend="zend.controller.request" /> au lieu d'un élément du
  91. distributeur.
  92. </para>
  93. </listitem>
  94. <listitem>
  95. <para>
  96. <methodname>Zend_Controller_Router_Interface::route()</methodname> accepte
  97. maintenant et retourne un objet <xref linkend="zend.controller.request" /> au
  98. lieu d'un élément du distributeur.
  99. </para>
  100. </listitem>
  101. <listitem>
  102. <para>
  103. Les changements de <classname>Zend_Controller_Action</classname>
  104. incluent&#160;:
  105. </para>
  106. <itemizedlist>
  107. <listitem>
  108. <para>
  109. Le constructeur accepte maintenant exactement trois arguments,
  110. <classname>Zend_Controller_Request_Abstract $request</classname>,
  111. <classname>Zend_Controller_Response_Abstract $response</classname>, et
  112. le tableau facultatif <varname>$params</varname>.
  113. <methodname>Zend_Controller_Action::__construct()</methodname> les
  114. utilise pour affecter la requête, la réponse, et les propriétés
  115. <code>invokeArgs</code> de l'objet, et si vous devez surcharger le
  116. constructeur, vous devez faire de même. La meilleure solution est
  117. d'utiliser la méthode <methodname>init()</methodname> pour réaliser toute
  118. configuration de l'instance, puisque cette méthode est appelée en tant
  119. que action finale du constructeur.
  120. </para>
  121. </listitem>
  122. <listitem>
  123. <para>
  124. <methodname>run()</methodname> n'est plus défini en tant qu'élément final,
  125. mais n'est pas non plus utilisé par le contrôleur frontal ; son seul
  126. but apparaît lors de l'utilisation de la classe en tant que contrôleur
  127. de page. Il prend maintenant deux arguments facultatifs, un
  128. <classname>Zend_Controller_Request_Abstract $request</classname> et un
  129. <classname>Zend_Controller_Response_Abstract
  130. $response</classname>.
  131. </para>
  132. </listitem>
  133. <listitem>
  134. <para>
  135. <methodname>indexAction()</methodname> ne nécessite plus d'être défini, mais
  136. est recommandé en tant qu'action par défaut. Ceci permet lors de
  137. l'utilisation de <code>RewriteRouter</code> et des contrôleurs d'action
  138. de spécifier différentes méthodes d'action par défaut.
  139. </para>
  140. </listitem>
  141. <listitem>
  142. <para>
  143. <methodname>__call()</methodname> peut être surchargé pour gérer
  144. automatiquement les actions non définies.
  145. </para>
  146. </listitem>
  147. <listitem>
  148. <para>
  149. <methodname>_redirect()</methodname> prend maintenant un second paramètre
  150. facultatif, le code <acronym>HTTP</acronym> à retourner avec la redirection, et un
  151. troisième paramètre optionnel, <varname>$prependBase</varname>, qui peut
  152. indiquer que l'URL de base enregistré avec l'objet requête peut être
  153. ajouté en tant que suffixe à l'URL spécifié.
  154. </para>
  155. </listitem>
  156. <listitem>
  157. <para>
  158. La propriété <code>_action</code> n'existe plus. Cette propriété
  159. était un <classname>Zend_Controller_Dispatcher_Token</classname>, qui
  160. n'existe plus maintenant. Le seul but de cet élément est de fournir
  161. l'information concernant le contrôleur, l'action et les paramètres
  162. d'URL de la requête. Cette information est maintenant disponible dans
  163. l'objet requête, et peut être interrogé comme ceci&#160;:
  164. </para>
  165. <programlisting language="php"><![CDATA[
  166. // Récupère le nom de controleur de la requête
  167. // L'accès se fait via : $this->_action->getControllerName().
  168. // L'exemple ci-dessous utilise getRequest(), bien que vous pourriez
  169. // accéder directement à la propriété $_request ;
  170. // l'utilisation de getRequest() est recommandée puisque la classe
  171. // parente peut surcharger l'accès à l'objet requête.
  172. $controller = $this->getRequest()->getControllerName();
  173. // Recupere le nom de l'action de la requete
  174. // L'acces se fait via : $this->_action->getActionName().
  175. $action = $this->getRequest()->getActionName();
  176. // Recupere les parametres de la requete
  177. // Ceci n'a pas changé ; les méthodes _getParams() et _getParam()
  178. // relaient simplement l'objet requete maintenant.
  179. $params = $this->_getParams();
  180. $foo = $this->_getParam('foo', 'default');
  181. // parametre de la requete 'foo', en utilisant 'default'
  182. // en tant que valeur par défaut si aucune valeur n'est trouvée
  183. ]]></programlisting>
  184. </listitem>
  185. <listitem>
  186. <para>
  187. <methodname>noRouteAction()</methodname> a été effacée. La manière appropriée
  188. de gérer les méthodes d'actions non-existantes est de les router vers
  189. une action par défaut en utilisant <methodname>__call()</methodname>&#160;:
  190. </para>
  191. <programlisting language="php"><![CDATA[
  192. public function __call($method, $args)
  193. {
  194. // Si la méthode requetee ne correspond a aucune methode 'Action',
  195. // on renvoie vers la méthode d'action par défaut :
  196. if ('Action' == substr($method, -6)) {
  197. return $this->defaultAction();
  198. }
  199. throw new Zend_Controller_Exception('Appel de methode invalide');
  200. }
  201. ]]></programlisting>
  202. </listitem>
  203. </itemizedlist>
  204. </listitem>
  205. <listitem>
  206. <para>
  207. <methodname>Zend_Controller_RewriteRouter::setRewriteBase()</methodname> a
  208. été effacée. Utilisez plutôt
  209. <methodname>Zend_Controller_Front::setBaseUrl()</methodname> (ou
  210. Zend_Controller_Request_Http::setBaseUrl(), si vous utilisez cette classe de
  211. requête).
  212. </para>
  213. </listitem>
  214. <listitem>
  215. <para>
  216. <classname>Zend_Controller_Plugin_Interface</classname> a été remplacée
  217. par <classname>Zend_Controller_Plugin_Abstract</classname>. Toutes les méthodes
  218. acceptent et retournent maintenant un objet
  219. <xref linkend="zend.controller.request" /> au lieu d'un élément du
  220. distributeur.
  221. </para>
  222. </listitem>
  223. </itemizedlist>
  224. </sect2>
  225. </sect1>