Zend_Controller-ActionController.xml 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <!-- EN-Revision: 24249 -->
  3. <!-- Reviewed: no -->
  4. <sect1 id="zend.controller.action">
  5. <title>Contrôleurs d'action</title>
  6. <sect2 id="zend.controller.action.introduction">
  7. <title>Introduction</title>
  8. <para>
  9. <classname>Zend_Controller_Action</classname> est une classe abstraite que vous
  10. pouvez utiliser avec le contrôleur frontal quand vous construisez un site Web basé sur
  11. le modèle de conception Modèle-Vues-Contrôleurs (<acronym>MVC</acronym>).
  12. </para>
  13. <para>
  14. Pour utiliser <classname>Zend_Controller_Action</classname>, vous devez la
  15. sous-classer dans vos propres classes de contrôleurs d'action (ou la sous-classer pour
  16. créer votre propre classe de base pour vos contrôleurs d'action). L'opération la plus
  17. basique est de la sous-classer, et de créer vos méthodes d'action qui correspondent aux
  18. différentes actions que vous souhaitez gérer. La gestion du routage et de la
  19. distribution des <classname>Zend_Controller</classname> va rechercher automatiquement
  20. les méthodes dont le nom termine par 'Action' dans votre classe et les considérer comme
  21. des actions potentiellement valides de votre contrôleur.
  22. </para>
  23. <para>Par exemple, considérons une classe définie comme ceci&#160;:</para>
  24. <programlisting language="php"><![CDATA[
  25. class FooController extends Zend_Controller_Action
  26. {
  27. public function barAction()
  28. {
  29. // réalise quelquechose
  30. }
  31. public function bazAction()
  32. {
  33. // réalise quelquechose
  34. }
  35. }
  36. ]]></programlisting>
  37. <para>
  38. La classe <emphasis>FooController</emphasis> (contrôleur <emphasis>foo</emphasis>)
  39. définit deux actions, <emphasis>bar</emphasis> et <emphasis>baz</emphasis>.
  40. </para>
  41. <para>
  42. Il y a d'autres fonctionnalités qui peuvent être utilisées, comme personnaliser
  43. l'initialisation des actions, gérer les actions par défaut quand aucune action ou une
  44. action invalide est fournie, avoir la possibilité de hook ("détournement") en pre et
  45. post-dispatch, et une variété de méthodes d'aides (helper). Ce chapitre fournit une vue
  46. d'ensemble des fonctionnalités du contrôleur d'action.
  47. </para>
  48. <note>
  49. <title>Comportement par défaut</title>
  50. <para>
  51. Par défaut, le <link linkend="zend.controller.front">contrôleur frontal</link>
  52. active l'aide d'action
  53. <link linkend="zend.controller.actionhelpers.viewrenderer">ViewRenderer</link>.
  54. Cette aide s'occupe de l'injection automatique de l'objet de vue dans vos
  55. contrôleurs, ainsi que du rendu de cette vue. Vous pouvez la désactiver au sein de
  56. vos contrôleurs par l'une ou l'autre des actions suivantes&#160;:
  57. </para>
  58. <programlisting language="php"><![CDATA[
  59. class FooController extends Zend_Controller_Action
  60. {
  61. public function init()
  62. {
  63. // Locale à ce seul contrôleur ; affecte toutes les actions,
  64. // si chargée dans l'init :
  65. $this->_helper->viewRenderer->setNoRender(true);
  66. // Global :
  67. $this->_helper->removeHelper('viewRenderer');
  68. // Global aussi, mais doit être réalisé en conjonction avec
  69. // la version locale pour être propagé dans ce contrôleur:
  70. Zend_Controller_Front::getInstance()->setParam('noViewRenderer',
  71. true);
  72. }
  73. }
  74. ]]></programlisting>
  75. <para>
  76. Les méthodes <methodname>initView()</methodname>,
  77. <methodname>getViewScript()</methodname>, <methodname>render()</methodname>, et
  78. <methodname>renderScript()</methodname> sont affectées chacune au
  79. <emphasis>ViewRenderer</emphasis> à moins que l'aide ne soit pas chargée dans le
  80. gestionnaire d'aide (helper broker) ou que l'option
  81. <emphasis>noViewRenderer</emphasis> n'ait été réglée.
  82. </para>
  83. <para>
  84. Vous pouvez simplement désactiver le rendu pour une vue individuelle grâce au
  85. drapeau <emphasis>noRender</emphasis> du <emphasis>ViewRenderer</emphasis>&#160;:
  86. </para>
  87. <programlisting language="php"><![CDATA[
  88. class FooController extends Zend_Controller_Action
  89. {
  90. public function barAction()
  91. {
  92. // désactive le rendu automatique pour cette action seulement :
  93. $this->_helper->viewRenderer->setNoRender();
  94. }
  95. }
  96. ]]></programlisting>
  97. <para>
  98. Les raisons principales de désactiver le <emphasis>ViewRenderer</emphasis> sont
  99. l'absence de besoin d'objets de vues ou si vous n'effectuez pas de rendu via des
  100. scripts de vues (par exemple, quand vous utilisez un contrôleur d'action pour
  101. servir des protocoles de service Web comme <acronym>SOAP</acronym>,
  102. <acronym>XML-RPC</acronym>, ou <acronym>REST</acronym>). Dans la plupart
  103. des cas, il n'est pas nécessaire de désactiver globalement le
  104. <emphasis>ViewRenderer</emphasis>, seulement de manière sélective pour des
  105. contrôleurs ou actions individuels.
  106. </para>
  107. </note>
  108. </sect2>
  109. <sect2 id="zend.controller.action.initialization">
  110. <title>Initialisation d'objet</title>
  111. <para>
  112. Même si vous pouvez toujours surcharger le constructeur du contrôleur d'action,
  113. nous ne vous le recommandons pas.
  114. <methodname>Zend_Controller_Action::__construct()</methodname> réalise certaines tâches
  115. importantes, comme l'enregistrement des objets de requêtes et de réponses, ainsi que
  116. l'invocation d'arguments personnalisés fourni par le contrôleur frontal. Si vous devez
  117. surcharger le constructeur, n'oubliez pas d'appeler
  118. <methodname>parent::__construct($request, $response, $invokeArgs)</methodname>.
  119. </para>
  120. <para>
  121. La manière la plus appropriée de personnaliser l'instanciation est d'utiliser la
  122. méthode <methodname>init()</methodname>, qui est appelée en dernière tâche de
  123. <methodname>__construct()</methodname>. Par exemple, si vous voulez vous connecter à
  124. une base de données à l'instanciation&#160;:
  125. </para>
  126. <programlisting language="php"><![CDATA[
  127. class FooController extends Zend_Controller_Action
  128. {
  129. public function init()
  130. {
  131. $this->db = Zend_Db::factory('Pdo_Mysql', array(
  132. 'host' => 'myhost',
  133. 'username' => 'user',
  134. 'password' => 'XXXXXXX',
  135. 'dbname' => 'website'
  136. ));
  137. }
  138. }
  139. ]]></programlisting>
  140. </sect2>
  141. <sect2 id="zend.controller.action.prepostdispatch">
  142. <title>Détournement Pre et Post-Dispatch (Hook)</title>
  143. <para>
  144. <classname>Zend_Controller_Action</classname> spécifie deux méthodes qui peuvent être
  145. appelées juste avant et juste après une action, <methodname>preDispatch()</methodname>
  146. et <methodname>postDispatch()</methodname>. Celles-ci peuvent être pratiques dans
  147. plusieurs cas&#160;: vérifier l'authentification et les <acronym>ACL</acronym> avant
  148. d'exécuter une action (en appelant <methodname>_forward()</methodname> dans
  149. <methodname>preDispatch()</methodname>, l'action sera évitée), par
  150. exemple, ou en plaçant du contenu généré dans une partie du modèle du site
  151. (<methodname>postDispatch()</methodname>).
  152. </para>
  153. <note>
  154. <title>Utilisation de init() ou de preDispatch()</title>
  155. <para>
  156. Dans la <link linkend="zend.controller.action.initialization">section
  157. précédente</link>, nous avons introduit la méthode
  158. <methodname>init()</methodname>, et dans celle-ci, la méthode
  159. <methodname>preDispatch()</methodname>. Quelles sont leurs différences, et quelles
  160. actions vont-elles réaliser chacune&#160;?
  161. </para>
  162. <para>
  163. La méthode <methodname>init()</methodname> a pour but principal d'étendre le
  164. constructeur. Typiquement, votre constructeur devrait simplement paramétrer les
  165. états des objets, mais pas réaliser d'opérations logiques. Ceci peut inclure
  166. l'initialisation des ressources utilisées dans le contrôleur (comme des modèles,
  167. des objets de configuration, etc.), ou assigner des valeurs issues du contrôleur
  168. frontal, du fichier d'amorçage, ou d'un registre.
  169. </para>
  170. <para>
  171. La méthode <methodname>preDispatch()</methodname> peut aussi être utilisée pour
  172. paramétrer un objet ou un environnement (par exemple, une vue, une aide d'action,
  173. etc.), mais son but principal est d'établir des décisions autorisant ou non une
  174. action requêtée à être distribuée. Si elle ne l'est pas, vous pouvez alors utiliser
  175. <methodname>_forward()</methodname> vers une autre action, ou lancer une exception.
  176. </para>
  177. <para>
  178. Note: la méthode <methodname>_forward()</methodname> s'exécutera pas correctement
  179. si elle est appelée depuis <methodname>init()</methodname>, ce qui est une
  180. formalisation des intentions de deux méthodes.
  181. </para>
  182. </note>
  183. </sect2>
  184. <sect2 id="zend.controller.action.accessors">
  185. <title>Accesseurs</title>
  186. <para>
  187. Un certain nombre d'objets et de variables sont enregistrés avec l'objet et chacun
  188. possède des méthodes accesseurs.
  189. </para>
  190. <itemizedlist>
  191. <listitem>
  192. <para>
  193. <emphasis>Objet Requête</emphasis>&#160;: <methodname>getRequest()</methodname>
  194. peut être utilisé pour récupérer l'objet de requête utilisé pour appeler
  195. l'action.
  196. </para>
  197. </listitem>
  198. <listitem>
  199. <para>
  200. <emphasis>Objet Réponse</emphasis>&#160;: <methodname>getResponse()</methodname>
  201. peut être utilisé pour récupérer l'objet de réponse assemblant la réponse
  202. finale. Quelques appels typiques peuvent ressembler à ceci&#160;:
  203. </para>
  204. <programlisting language="php"><![CDATA[
  205. $this->getResponse()->setHeader('Content-Type', 'text/xml');
  206. $this->getResponse()->appendBody($content);
  207. ]]></programlisting>
  208. </listitem>
  209. <listitem>
  210. <para>
  211. <emphasis>Arguments d'invocation</emphasis>&#160;: le contrôleur frontal peut
  212. transmettre des paramètres au routeur, au distributeur, et au contrôleur
  213. d'action. Pour récupérer individuellement ceux-ci utilisez
  214. <methodname>getInvokeArg($key)</methodname> ; alternativement, récupérer la
  215. liste entière en utilisant <methodname>getInvokeArgs()</methodname>.
  216. </para>
  217. </listitem>
  218. <listitem>
  219. <para>
  220. <emphasis>Paramètres de requêtes</emphasis>&#160;: l'objet de requête
  221. rassemble les paramètres de requête, comme les paramètres
  222. <constant>_GET</constant> ou _<constant>_POST</constant>, ou les
  223. paramètres utilisateurs spécifiés dans le chemin d'<acronym>URL</acronym>.
  224. Pour récupérer ceux-ci utilisez <methodname>_getParam($key)</methodname> ou
  225. <methodname>_getAllParams()</methodname>. Vous pouvez aussi régler ces
  226. paramètres en utilisant <methodname>_setParam()</methodname>&#160;;
  227. ceci est pratique quand vous redirigez vers des actions additionnelles.
  228. </para>
  229. <para>
  230. Pour tester si un paramètre existe ou non (pratique pour les branchements
  231. logiques), utilisez <methodname>_hasParam($key)</methodname>.
  232. </para>
  233. <note>
  234. <para>
  235. <methodname>_getParam()</methodname> peut prendre un second paramètre
  236. optionnel contenant une valeur par défaut à utiliser si le paramètre n'est
  237. pas réglé ou qu'il est vide. Utiliser ceci élimine la nécessité d'appeler
  238. <methodname>_hasParam()</methodname> avant de récupérer une valeur&#160;:
  239. </para>
  240. <programlisting language="php"><![CDATA[
  241. // Utilise une valeur par défaut de 1 si id n'est pas réglé
  242. $id = $this->_getParam('id', 1);
  243. // Au lieu de :
  244. if ($this->_hasParam('id') {
  245. $id = $this->_getParam('id');
  246. } else {
  247. $id = 1;
  248. }
  249. ]]></programlisting>
  250. </note>
  251. </listitem>
  252. </itemizedlist>
  253. </sect2>
  254. <sect2 id="zend.controller.action.viewintegration">
  255. <title>Intégration des Vues</title>
  256. <note id="zend.controller.action.viewintegration.viewrenderer">
  257. <title>
  258. Par défaut, l'intégration des vues est réalisé via le ViewRenderer
  259. </title>
  260. <para>
  261. Le contenu de cette section n'est valable que si vous avez explicitement
  262. désactivé le
  263. <link linkend="zend.controller.actionhelpers.viewrenderer">ViewRenderer</link>.
  264. Sinon, vous pouvez passer à la section suivante.
  265. </para>
  266. </note>
  267. <para>
  268. <classname>Zend_Controller_Action</classname> fournit un mécanisme rudimentaire
  269. et flexible pour l'intégration des vues. Deux méthodes accomplissent ceci,
  270. <methodname>initView()</methodname> et <methodname>render()</methodname>&#160;; la
  271. première méthode charge la propriété publique <varname>$view</varname>, et la dernière
  272. effectue le rendu d'une vue basé sur l'action courante demandée dans la requête, en
  273. utilisant la hiérarchie des répertoires pour déterminer le chemin du script.
  274. </para>
  275. <sect3 id="zend.controller.action.viewintegration.initview">
  276. <title>Initialisation des Vues</title>
  277. <para>
  278. <methodname>initView()</methodname> initialise l'objet Vue.
  279. <methodname>render()</methodname> appelle <methodname>initView()</methodname> dans
  280. le but de récupérer l'objet de vue, mais il peut être
  281. initialisé à tout moment&#160;; par défaut il remplit la propriété
  282. <varname>$view</varname> avec un objet <classname>Zend_View</classname>, mais toute
  283. classe implémentant <classname>Zend_View_Interface</classname> peut être utilisée.
  284. Si <varname>$view</varname> est déjà initialisé, il retourne simplement cette
  285. propriété.
  286. </para>
  287. <para>
  288. La mise en oeuvre par défaut suppose la structure de répertoire suivante&#160;:
  289. </para>
  290. <programlisting language="php"><![CDATA[
  291. applicationOrModule/
  292. controllers/
  293. IndexController.php
  294. views/
  295. scripts/
  296. index/
  297. index.phtml
  298. helpers/
  299. filters/
  300. ]]></programlisting>
  301. <para>
  302. En d'autres termes, les scripts de vues sont supposés être dans le
  303. sous-répertoire <filename>/views/scripts/</filename>, et le sous-répertoire
  304. <filename>/views/</filename> est censé contenir les fonctionnalités soeurs
  305. (aides [helpers], filtres [filters]). En déterminant le script de vue et son
  306. chemin, le répertoire <filename>/views/scripts/</filename> est utilisé comme
  307. chemin de base, avec des dossiers nommés par le nom de contrôleur fournissant
  308. ainsi la hiérarchie des scripts de vues.
  309. </para>
  310. </sect3>
  311. <sect3 id="zend.controller.action.viewintegration.render">
  312. <title>Effectuer le rendu des Vues</title>
  313. <para><methodname>render()</methodname> a la signature suivante&#160;:</para>
  314. <programlisting language="php"><![CDATA[
  315. string render(string $action = null,
  316. string $name = null,
  317. bool $noController = false);
  318. ]]></programlisting>
  319. <para>
  320. <methodname>render()</methodname> effectue le rendu d'un script de vue. Si aucun
  321. argument n'est fourni, la méthode suppose que le script requêté est
  322. <filename>[controller]/[action].phtml</filename> (où <filename>.phtml</filename>
  323. est la valeur de la propriété <varname>$viewSuffix</varname>). Fournir une valeur
  324. pour <varname>$action</varname> va effectuer le rendu du script dans le sous-dossier
  325. <filename>/[controller]/</filename>. Pour surcharger l'utilisation du sous-dossier
  326. <filename>/[controller]/</filename>, fournissez la valeur <constant>TRUE</constant>
  327. à <varname>$noController</varname>. Enfin, les scripts sont rendus dans l'objet
  328. réponse&#160;; si vous souhaitez effectuer le rendu dans un
  329. <link linkend="zend.controller.response.namedsegments">segment
  330. nommé</link>spécifique de l'objet réponse, fournissez une valeur à
  331. <varname>$name</varname>.
  332. </para>
  333. <note>
  334. <para>
  335. Puisque le contrôleur et des noms d'action peuvent contenir des caractères
  336. délimiteurs de mot comme '_', '.' et '-', <methodname>render()</methodname>
  337. normalise ceux-ci à '-' en déterminant le nom du script. En interne, il utilise
  338. le délimiteur de mot et de chemin du istributeur pour faire cette normalisation.
  339. Ainsi, une requête pour <filename>/foo.bar/baz-bat</filename> rendra le
  340. script <filename>foo-bar/baz-bat.phtml</filename>. Si votre méthode d'action
  341. contient des notationsCamel, veuillez vous souvenir que ceci va résulter avec
  342. des mots séparés par '-' en déterminant le nom de fichier du script de vue.
  343. </para>
  344. </note>
  345. <para>Quelques exemples :</para>
  346. <programlisting language="php"><![CDATA[
  347. class MonController extends Zend_Controller_Action
  348. {
  349. public function fooAction()
  350. {
  351. // Effectue le rendu de mon/foo.phtml
  352. $this->render();
  353. // Effectue le rendu de mon/bar.phtml
  354. $this->render('bar');
  355. // Effectue le rendu de baz.phtml
  356. $this->render('baz', null, true);
  357. // Effectue le rendu de mon/login.phtml vers le segment
  358. // 'form' de l'objet réponse
  359. $this->render('login', 'form');
  360. // Effectue le rendu de site.phtml vers le segment
  361. // 'page' de l'objet réponse ; sans utiliser
  362. // le sous-dossier 'mon/'
  363. $this->render('site', 'page', true);
  364. }
  365. public function bazBatAction()
  366. {
  367. // Effectue le rendu de mon/baz-bat.phtml
  368. $this->render();
  369. }
  370. }
  371. ]]></programlisting>
  372. </sect3>
  373. </sect2>
  374. <sect2 id="zend.controller.action.utilmethods">
  375. <title>Méthodes utiles</title>
  376. <para>
  377. En plus de l'accesseur et des méthodes d'intégration de vue,
  378. <classname>Zend_Controller_Action</classname> possède plusieurs méthodes utiles pour
  379. exécuter des tâches communes de l'intérieur de vos méthodes d'action (ou de
  380. pre-&#160;/&#160;post-dispatch).
  381. </para>
  382. <itemizedlist>
  383. <listitem>
  384. <para>
  385. <methodname>_forward($action, $controller = null, $module = null, array $params
  386. = null)</methodname>&#160;: exécute une autre action. Si appelé dans
  387. <methodname>preDispatch()</methodname>, la requête courante est évitée en
  388. faveur de la nouvelle. Sinon, après que l'action courante ait été exécutée,
  389. l'action demandée dans <methodname>_forward()</methodname> sera exécutée à
  390. son tour.
  391. </para>
  392. </listitem>
  393. <listitem>
  394. <para>
  395. <methodname>_redirect($url, array $options = array())</methodname>&#160;:
  396. redirige vers une autre page. Cette méthode prend un <acronym>URL</acronym>
  397. et un jeu d'options optionnel. Par défaut, il exécute une redirection de
  398. type <acronym>HTTP</acronym> 302.
  399. </para>
  400. <para>Les options peuvent inclure une ou plusieurs des clés suivantes :</para>
  401. <itemizedlist>
  402. <listitem>
  403. <para>
  404. <emphasis></emphasis>&#160;: avec ou sans sortie immédiate. Si
  405. appelée, la méthode fermera proprement toute session ouverte et
  406. réalisera la redirection.
  407. </para>
  408. <para>
  409. Vous pouvez régler cette option de manière globale dans le
  410. contrôleur en utilisant l'accesseur
  411. <methodname>setRedirectExit()</methodname>.
  412. </para>
  413. </listitem>
  414. <listitem>
  415. <para>
  416. <emphasis>prependBase</emphasis>&#160;: ajoute ou non
  417. l'<acronym>URL</acronym> de base enregistré dans l'objet
  418. requête à l'<acronym>URL</acronym> produit.
  419. </para>
  420. <para>
  421. Vous pouvez régler cette option de manière globale dans le
  422. contrôleur en utilisant l'accesseur
  423. <methodname>setRedirectPrependBase()</methodname>.
  424. </para>
  425. </listitem>
  426. <listitem>
  427. <para>
  428. <emphasis>code</emphasis>&#160;: fournit le code <acronym>HTTP</acronym>
  429. à utiliser pour la redirection. Par défaut, un <acronym>HTTP</acronym>
  430. 302 est utilisé ; tout code compris entre 301 et 306 peut être utilisé.
  431. </para>
  432. <para>
  433. Vous pouvez régler cette option de manière globale dans le
  434. contrôleur en utilisant l'accesseur
  435. <methodname>setRedirectCode()</methodname>.
  436. </para>
  437. </listitem>
  438. </itemizedlist>
  439. </listitem>
  440. </itemizedlist>
  441. </sect2>
  442. <sect2 id="zend.controller.action.subclassing">
  443. <title>Sous-classer le contrôleur d'action</title>
  444. <para>
  445. Par conception, <classname>Zend_Controller_Action</classname> doit être
  446. sous-classé pour créer un contrôleur d'action. Au minimum, vous devez définir les
  447. méthodes d'action que le contrôleur d'action peut appeler.
  448. </para>
  449. <para>
  450. En plus de la création de fonctionnalité utile pour vos applications Web, vous
  451. pouvez aussi constater que vous répétez souvent la même installation ou les mêmes
  452. méthodes utilitaires dans vos contrôleurs divers ; s'il en est ainsi, créer une classe
  453. de contrôleur de base commune qui étend <classname>Zend_Controller_Action</classname>
  454. peut résoudre une telle redondance.
  455. </para>
  456. <example id="zend.controller.action.subclassing.example-call">
  457. <title>Comment gérer des actions non-existantes</title>
  458. <para>
  459. Si une requête vers un contrôleur est faite en incluant une méthode d'action
  460. indéfinie, <methodname>Zend_Controller_Action::__call()</methodname> sera invoqué.
  461. <methodname>__call()</methodname> est, bien sûr, la méthode magique de
  462. <acronym>PHP</acronym> pour la surcharge de méthode.
  463. </para>
  464. <para>
  465. Par défaut, cette méthode lève une
  466. <classname>Zend_Controller_Action_Exception</classname> indiquant que la méthode
  467. requêtée n'a pas été trouvée dans le contrôleur. Si la méthode requêtée se termine
  468. par "Action", on considère qu'une action était requêté et qu'elle n'existe pas ; un
  469. telle erreur entraîne une exception ayant un code 404. Tout autre appel de méthode
  470. entraîne une exception ayant un code 500. Ceci vous permet de facilement
  471. différencier une page inconnue et une erreur de l'application dans votre
  472. gestionnaire d'erreur.
  473. </para>
  474. <para>
  475. Vous pouvez surcharger cette fonctionnalité si vous souhaitez exécuter
  476. d'autres opérations. Par exemple, si vous souhaitez afficher un message d'erreur,
  477. vous pouvez écrire quelque chose comme ceci&#160;:
  478. </para>
  479. <programlisting language="php"><![CDATA[
  480. class MonController extends Zend_Controller_Action
  481. {
  482. public function __call($method, $args)
  483. {
  484. if ('Action' == substr($method, -6)) {
  485. // Si une méthode d'action n'est pas trouvée,
  486. // rendre le script d'erreur
  487. return $this->render('error');
  488. }
  489. // pour toute autre méthode, levée d'une exception
  490. throw new Exception('Méthode invalide "' . $method . '" appelée',
  491. 500);
  492. }
  493. }
  494. ]]></programlisting>
  495. <para>
  496. Une autre possibilité est de rediriger vers une page de contrôleur par
  497. défaut&#160;:
  498. </para>
  499. <programlisting language="php"><![CDATA[
  500. class MyController extends Zend_Controller_Action
  501. {
  502. public function indexAction()
  503. {
  504. $this->render();
  505. }
  506. public function __call($method, $args)
  507. {
  508. if ('Action' == substr($method, -6)) {
  509. // Si une méthode d'action n'est pas trouvée,
  510. // rediriger vers l'action index
  511. return $this->_forward('index');
  512. }
  513. // pour tout autre méthode, levée d'une exception
  514. throw new Exception('Méthode invalide "' . $method . '" appelée',
  515. 500);
  516. }
  517. }
  518. ]]></programlisting>
  519. </example>
  520. <para>
  521. En plus de la surcharge de <methodname>__call()</methodname>, chacune des méthodes
  522. d'initialisation , utilitaires, d'accesseurs, de vues et de détournement de la
  523. distribution mentionnées ci-dessus peuvent être surchargées dans le but de
  524. personnaliser vos contrôleurs. Par exemple, si vous stockez votre objet de vue dans le
  525. registre, vous pouvez vouloir modifier votre méthode <methodname>initView()</methodname>
  526. avec une code comme celui-ci&#160;:
  527. </para>
  528. <programlisting language="php"><![CDATA[
  529. abstract class Ma_Base_Controller extends Zend_Controller_Action
  530. {
  531. public function initView()
  532. {
  533. if (null === $this->view) {
  534. if (Zend_Registry::isRegistered('view')) {
  535. $this->view = Zend_Registry::get('view');
  536. } else {
  537. $this->view = new Zend_View();
  538. $this->view->setBasePath(dirname(__FILE__) . '/../views');
  539. }
  540. }
  541. return $this->view;
  542. }
  543. }
  544. ]]></programlisting>
  545. <para>
  546. En espérant que les informations de ce chapitre vous permettent de voir la
  547. flexibilité de ce composant particulier et comment vous pouvez le modifier suivant les
  548. besoins de votre application.
  549. </para>
  550. </sect2>
  551. </sect1>