Zend_Controller-ActionController.xml 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <!-- EN-Revision: 16649 -->
  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. </sect2>
  154. <sect2 id="zend.controller.action.accessors">
  155. <title>Accesseurs</title>
  156. <para>
  157. Un certain nombre d'objets et de variables sont enregistrés avec l'objet et chacun
  158. possède des méthodes accesseurs.
  159. </para>
  160. <itemizedlist>
  161. <listitem>
  162. <para>
  163. <emphasis>Objet Requête</emphasis>&#160;: <methodname>getRequest()</methodname>
  164. peut être utilisé pour récupérer l'objet de requête utilisé pour appeler
  165. l'action.
  166. </para>
  167. </listitem>
  168. <listitem>
  169. <para>
  170. <emphasis>Objet Réponse</emphasis>&#160;: <methodname>getResponse()</methodname>
  171. peut être utilisé pour récupérer l'objet de réponse assemblant la réponse
  172. finale. Quelques appels typiques peuvent ressembler à ceci&#160;:
  173. </para>
  174. <programlisting language="php"><![CDATA[
  175. $this->getResponse()->setHeader('Content-Type', 'text/xml');
  176. $this->getResponse()->appendBody($content);
  177. ]]></programlisting>
  178. </listitem>
  179. <listitem>
  180. <para>
  181. <emphasis>Arguments d'invocation</emphasis>&#160;: le contrôleur frontal peut
  182. transmettre des paramètres au routeur, au distributeur, et au contrôleur
  183. d'action. Pour récupérer individuellement ceux-ci utilisez
  184. <methodname>getInvokeArg($key)</methodname> ; alternativement, récupérer la
  185. liste entière en utilisant <methodname>getInvokeArgs()</methodname>.
  186. </para>
  187. </listitem>
  188. <listitem>
  189. <para>
  190. <emphasis>Paramètres de requêtes</emphasis>&#160;: l'objet de requête
  191. rassemble les paramètres de requête, comme les paramètres
  192. <constant>_GET</constant> ou _<constant>_POST</constant>, ou les
  193. paramètres utilisateurs spécifiés dans le chemin d'<acronym>URL</acronym>.
  194. Pour récupérer ceux-ci utilisez <methodname>_getParam($key)</methodname> ou
  195. <methodname>_getAllParams()</methodname>. Vous pouvez aussi régler ces
  196. paramètres en utilisant <methodname>_setParam()</methodname>&#160;;
  197. ceci est pratique quand vous redirigez vers des actions additionnelles.
  198. </para>
  199. <para>
  200. Pour tester si un paramètre existe ou non (pratique pour les branchements
  201. logiques), utilisez <methodname>_hasParam($key)</methodname>.
  202. </para>
  203. <note>
  204. <para>
  205. <methodname>_getParam()</methodname> peut prendre un second paramètre
  206. optionnel contenant une valeur par défaut à utiliser si le paramètre n'est
  207. pas réglé ou qu'il est vide. Utiliser ceci élimine la nécessité d'appeler
  208. <methodname>_hasParam()</methodname> avant de récupérer une valeur&#160;:
  209. </para>
  210. <programlisting language="php"><![CDATA[
  211. // Utilise une valeur par défaut de 1 si id n'est pas réglé
  212. $id = $this->_getParam('id', 1);
  213. // Au lieu de :
  214. if ($this->_hasParam('id') {
  215. $id = $this->_getParam('id');
  216. } else {
  217. $id = 1;
  218. }
  219. ]]></programlisting>
  220. </note>
  221. </listitem>
  222. </itemizedlist>
  223. </sect2>
  224. <sect2 id="zend.controller.action.viewintegration">
  225. <title>Intégration des Vues</title>
  226. <note id="zend.controller.action.viewintegration.viewrenderer">
  227. <title>
  228. Par défaut, l'intégration des vues est réalisé via le ViewRenderer
  229. </title>
  230. <para>
  231. Le contenu de cette section n'est valable que si vous avez explicitement
  232. désactivé le
  233. <link linkend="zend.controller.actionhelpers.viewrenderer">ViewRenderer</link>.
  234. Sinon, vous pouvez passer à la section suivante.
  235. </para>
  236. </note>
  237. <para>
  238. <classname>Zend_Controller_Action</classname> fournit un mécanisme rudimentaire
  239. et flexible pour l'intégration des vues. Deux méthodes accomplissent ceci,
  240. <methodname>initView()</methodname> et <methodname>render()</methodname>&#160;; la
  241. première méthode charge la propriété publique <varname>$view</varname>, et la dernière
  242. effectue le rendu d'une vue basé sur l'action courante demandée dans la requête, en
  243. utilisant la hiérarchie des répertoires pour déterminer le chemin du script.
  244. </para>
  245. <sect3 id="zend.controller.action.viewintegration.initview">
  246. <title>Initialisation des Vues</title>
  247. <para>
  248. <methodname>initView()</methodname> initialise l'objet Vue.
  249. <methodname>render()</methodname> appelle <methodname>initView()</methodname> dans
  250. le but de récupérer l'objet de vue, mais il peut être
  251. initialisé à tout moment&#160;; par défaut il remplit la propriété
  252. <varname>$view</varname> avec un objet <classname>Zend_View</classname>, mais toute
  253. classe implémentant <classname>Zend_View_Interface</classname> peut être utilisée.
  254. Si <varname>$view</varname> est déjà initialisé, il retourne simplement cette
  255. propriété.
  256. </para>
  257. <para>
  258. La mise en oeuvre par défaut suppose la structure de répertoire suivante&#160;:
  259. </para>
  260. <programlisting language="php"><![CDATA[
  261. applicationOrModule/
  262. controllers/
  263. IndexController.php
  264. views/
  265. scripts/
  266. index/
  267. index.phtml
  268. helpers/
  269. filters/
  270. ]]></programlisting>
  271. <para>
  272. En d'autres termes, les scripts de vues sont supposés être dans le
  273. sous-répertoire <filename>/views/scripts/</filename>, et le sous-répertoire
  274. <filename>/views/</filename> est censé contenir les fonctionnalités soeurs
  275. (aides [helpers], filtres [filters]). En déterminant le script de vue et son
  276. chemin, le répertoire <filename>/views/scripts/</filename> est utilisé comme
  277. chemin de base, avec des dossiers nommés par le nom de contrôleur fournissant
  278. ainsi la hiérarchie des scripts de vues.
  279. </para>
  280. </sect3>
  281. <sect3 id="zend.controller.action.viewintegration.render">
  282. <title>Effectuer le rendu des Vues</title>
  283. <para><methodname>render()</methodname> a la signature suivante&#160;:</para>
  284. <programlisting language="php"><![CDATA[
  285. string render(string $action = null,
  286. string $name = null,
  287. bool $noController = false);
  288. ]]></programlisting>
  289. <para>
  290. <methodname>render()</methodname> effectue le rendu d'un script de vue. Si aucun
  291. argument n'est fourni, la méthode suppose que le script requêté est
  292. <filename>[controller]/[action].phtml</filename> (où <filename>.phtml</filename>
  293. est la valeur de la propriété <varname>$viewSuffix</varname>). Fournir une valeur
  294. pour <varname>$action</varname> va effectuer le rendu du script dans le sous-dossier
  295. <filename>/[controller]/</filename>. Pour surcharger l'utilisation du sous-dossier
  296. <filename>/[controller]/</filename>, fournissez la valeur <constant>TRUE</constant>
  297. à <varname>$noController</varname>. Enfin, les scripts sont rendus dans l'objet
  298. réponse&#160;; si vous souhaitez effectuer le rendu dans un
  299. <link linkend="zend.controller.response.namedsegments">segment
  300. nommé</link>spécifique de l'objet réponse, fournissez une valeur à
  301. <varname>$name</varname>.
  302. </para>
  303. <note>
  304. <para>
  305. Puisque le contrôleur et des noms d'action peuvent contenir des caractères
  306. délimiteurs de mot comme '_', '.' et '-', <methodname>render()</methodname>
  307. normalise ceux-ci à '-' en déterminant le nom du script. En interne, il utilise
  308. le délimiteur de mot et de chemin du istributeur pour faire cette normalisation.
  309. Ainsi, une requête pour <filename>/foo.bar/baz-bat</filename> rendra le
  310. script <filename>foo-bar/baz-bat.phtml</filename>. Si votre méthode d'action
  311. contient des notationsCamel, veuillez vous souvenir que ceci va résulter avec
  312. des mots séparés par '-' en déterminant le nom de fichier du script de vue.
  313. </para>
  314. </note>
  315. <para>Quelques exemples :</para>
  316. <programlisting language="php"><![CDATA[
  317. class MonController extends Zend_Controller_Action
  318. {
  319. public function fooAction()
  320. {
  321. // Effectue le rendu de mon/foo.phtml
  322. $this->render();
  323. // Effectue le rendu de mon/bar.phtml
  324. $this->render('bar');
  325. // Effectue le rendu de baz.phtml
  326. $this->render('baz', null, true);
  327. // Effectue le rendu de mon/login.phtml vers le segment
  328. // 'form' de l'objet réponse
  329. $this->render('login', 'form');
  330. // Effectue le rendu de site.phtml vers le segment
  331. // 'page' de l'objet réponse ; sans utiliser
  332. // le sous-dossier 'mon/'
  333. $this->render('site', 'page', true);
  334. }
  335. public function bazBatAction()
  336. {
  337. // Effectue le rendu de mon/baz-bat.phtml
  338. $this->render();
  339. }
  340. }
  341. ]]></programlisting>
  342. </sect3>
  343. </sect2>
  344. <sect2 id="zend.controller.action.utilmethods">
  345. <title>Méthodes utiles</title>
  346. <para>
  347. En plus de l'accesseur et des méthodes d'intégration de vue,
  348. <classname>Zend_Controller_Action</classname> possède plusieurs méthodes utiles pour
  349. exécuter des tâches communes de l'intérieur de vos méthodes d'action (ou de
  350. pre-&#160;/&#160;post-dispatch).
  351. </para>
  352. <itemizedlist>
  353. <listitem>
  354. <para>
  355. <methodname>_forward($action, $controller = null, $module = null, array $params
  356. = null)</methodname>&#160;: exécute une autre action. Si appelé dans
  357. <methodname>preDispatch()</methodname>, la requête courante est évitée en
  358. faveur de la nouvelle. Sinon, après que l'action courante ait été exécutée,
  359. l'action demandée dans <methodname>_forward()</methodname> sera exécutée à
  360. son tour.
  361. </para>
  362. </listitem>
  363. <listitem>
  364. <para>
  365. <methodname>_redirect($url, array $options = array())</methodname>&#160;:
  366. redirige vers une autre page. Cette méthode prend un <acronym>URL</acronym>
  367. et un jeu d'options optionnel. Par défaut, il exécute une redirection de
  368. type <acronym>HTTP</acronym> 302.
  369. </para>
  370. <para>Les options peuvent inclure une ou plusieurs des clés suivantes :</para>
  371. <itemizedlist>
  372. <listitem>
  373. <para>
  374. <emphasis></emphasis>&#160;: avec ou sans sortie immédiate. Si
  375. appelée, la méthode fermera proprement toute session ouverte et
  376. réalisera la redirection.
  377. </para>
  378. <para>
  379. Vous pouvez régler cette option de manière globale dans le
  380. contrôleur en utilisant l'accesseur
  381. <methodname>setRedirectExit()</methodname>.
  382. </para>
  383. </listitem>
  384. <listitem>
  385. <para>
  386. <emphasis>prependBase</emphasis>&#160;: ajoute ou non
  387. l'<acronym>URL</acronym> de base enregistré dans l'objet
  388. requête à l'<acronym>URL</acronym> produit.
  389. </para>
  390. <para>
  391. Vous pouvez régler cette option de manière globale dans le
  392. contrôleur en utilisant l'accesseur
  393. <methodname>setRedirectPrependBase()</methodname>.
  394. </para>
  395. </listitem>
  396. <listitem>
  397. <para>
  398. <emphasis>code</emphasis>&#160;: fournit le code <acronym>HTTP</acronym>
  399. à utiliser pour la redirection. Par défaut, un <acronym>HTTP</acronym>
  400. 302 est utilisé ; tout code compris entre 301 et 306 peut être utilisé.
  401. </para>
  402. <para>
  403. Vous pouvez régler cette option de manière globale dans le
  404. contrôleur en utilisant l'accesseur
  405. <methodname>setRedirectCode()</methodname>.
  406. </para>
  407. </listitem>
  408. </itemizedlist>
  409. </listitem>
  410. </itemizedlist>
  411. </sect2>
  412. <sect2 id="zend.controller.action.subclassing">
  413. <title>Sous-classer le contrôleur d'action</title>
  414. <para>
  415. Par conception, <classname>Zend_Controller_Action</classname> doit être
  416. sous-classé pour créer un contrôleur d'action. Au minimum, vous devez définir les
  417. méthodes d'action que le contrôleur d'action peut appeler.
  418. </para>
  419. <para>
  420. En plus de la création de fonctionnalité utile pour vos applications Web, vous
  421. pouvez aussi constater que vous répétez souvent la même installation ou les mêmes
  422. méthodes utilitaires dans vos contrôleurs divers ; s'il en est ainsi, créer une classe
  423. de contrôleur de base commune qui étend <classname>Zend_Controller_Action</classname>
  424. peut résoudre une telle redondance.
  425. </para>
  426. <example id="zend.controller.action.subclassing.example-call">
  427. <title>Comment gérer des actions non-existantes</title>
  428. <para>
  429. Si une requête vers un contrôleur est faite en incluant une méthode d'action
  430. indéfinie, <methodname>Zend_Controller_Action::__call()</methodname> sera invoqué.
  431. <methodname>__call()</methodname> est, bien sûr, la méthode magique de
  432. <acronym>PHP</acronym> pour la surcharge de méthode.
  433. </para>
  434. <para>
  435. Par défaut, cette méthode lève une
  436. <classname>Zend_Controller_Action_Exception</classname> indiquant que la méthode
  437. requêtée n'a pas été trouvée dans le contrôleur. Si la méthode requêtée se termine
  438. par "Action", on considère qu'une action était requêté et qu'elle n'existe pas ; un
  439. telle erreur entraîne une exception ayant un code 404. Tout autre appel de méthode
  440. entraîne une exception ayant un code 500. Ceci vous permet de facilement
  441. différencier une page inconnue et une erreur de l'application dans votre
  442. gestionnaire d'erreur.
  443. </para>
  444. <para>
  445. Vous pouvez surcharger cette fonctionnalité si vous souhaitez exécuter
  446. d'autres opérations. Par exemple, si vous souhaitez afficher un message d'erreur,
  447. vous pouvez écrire quelque chose comme ceci&#160;:
  448. </para>
  449. <programlisting language="php"><![CDATA[
  450. class MonController extends Zend_Controller_Action
  451. {
  452. public function __call($method, $args)
  453. {
  454. if ('Action' == substr($method, -6)) {
  455. // Si une méthode d'action n'est pas trouvée,
  456. // rendre le script d'erreur
  457. return $this->render('error');
  458. }
  459. // pour toute autre méthode, levée d'une exception
  460. throw new Exception('Méthode invalide "' . $method . '" appelée',
  461. 500);
  462. }
  463. }
  464. ]]></programlisting>
  465. <para>
  466. Une autre possibilité est de rediriger vers une page de contrôleur par
  467. défaut&#160;:
  468. </para>
  469. <programlisting language="php"><![CDATA[
  470. class MyController extends Zend_Controller_Action
  471. {
  472. public function indexAction()
  473. {
  474. $this->render();
  475. }
  476. public function __call($method, $args)
  477. {
  478. if ('Action' == substr($method, -6)) {
  479. // Si une méthode d'action n'est pas trouvée,
  480. // rediriger vers l'action index
  481. return $this->_forward('index');
  482. }
  483. // pour tout autre méthode, levée d'une exception
  484. throw new Exception('Méthode invalide "' . $method . '" appelée',
  485. 500);
  486. }
  487. }
  488. ]]></programlisting>
  489. </example>
  490. <para>
  491. En plus de la surcharge de <methodname>__call()</methodname>, chacune des méthodes
  492. d'initialisation , utilitaires, d'accesseurs, de vues et de détournement de la
  493. distribution mentionnées ci-dessus peuvent être surchargées dans le but de
  494. personnaliser vos contrôleurs. Par exemple, si vous stockez votre objet de vue dans le
  495. registre, vous pouvez vouloir modifier votre méthode <methodname>initView()</methodname>
  496. avec une code comme celui-ci&#160;:
  497. </para>
  498. <programlisting language="php"><![CDATA[
  499. abstract class Ma_Base_Controller extends Zend_Controller_Action
  500. {
  501. public function initView()
  502. {
  503. if (null === $this->view) {
  504. if (Zend_Registry::isRegistered('view')) {
  505. $this->view = Zend_Registry::get('view');
  506. } else {
  507. $this->view = new Zend_View();
  508. $this->view->setBasePath(dirname(__FILE__) . '/../views');
  509. }
  510. }
  511. return $this->view;
  512. }
  513. }
  514. ]]></programlisting>
  515. <para>
  516. En espérant que les informations de ce chapitre vous permettent de voir la
  517. flexibilité de ce composant particulier et comment vous pouvez le modifier suivant les
  518. besoins de votre application.
  519. </para>
  520. </sect2>
  521. </sect1>