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