1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176
|
<?xml version="1.0" encoding="utf-8"?>
<!-- EN-Revision: 24249 -->
<!-- Reviewed: no -->
<sect1 id="zend.controller.basics">
<title>Fondations de Zend_Controller</title>
<para>
Le système <classname>Zend_Controller</classname> est conçu pour être léger,
modulaire, et extensible. Il est de conception minimaliste pour permettre la flexibilité et
la liberté aux utilisateurs tout en fournissant assez de structure de sorte que les
systèmes établis autour de <classname>Zend_Controller</classname> partagent certaines
conventions communes et dispositions semblables de code.
</para>
<para>
Le diagramme suivant décrit le déroulement des opérations, et ce qui suit décrit en
détail les interactions :
</para>
<para>
<inlinegraphic align="center" fileref="figures/zend.controller.basics.png"
format="PNG" scale="100" valign="middle" width="483" />
</para>
<para>
Le déroulement des opérations de <classname>Zend_Controller</classname> est
implémenté par plusieurs composants. Même s'il n'est pas nécessaire de comprendre
complètement les détails de tous ces composants pour employer le système, avoir une bonne
connaissance du fonctionnement du processus est utile.
</para>
<itemizedlist>
<listitem>
<para>
<classname>Zend_Controller_Front</classname> orchestre le déroulement entier
des opérations du système <classname>Zend_Controller</classname>. C'est une
interprétation du modèle contrôleur frontal ("FrontController").
<classname>Zend_Controller_Front</classname> traite toutes les demandes reçues par
le serveur et est finalement responsable de déléguer les demandes aux contrôleurs
d'action ("ActionControllers" [<classname>Zend_Controller_Action</classname>]).
</para>
</listitem>
<listitem>
<para>
<classname>Zend_Controller_Request_Abstract</classname> (souvent référencé
comme <code>Request Object</code>) représente l'environnement de la requête et
fournit les méthodes pour régler et rechercher le contrôleur, l'action et les
paramètres fournis. De plus il contient l'information si l'action qu'elle contient
a été distribuée ou non par <classname>Zend_Controller_Dispatcher</classname>. Des
extensions de l'objet abstrait de requête peuvent être employées pour encapsuler
l'environnement entier de requête, permettant à des routeurs de récupérer les
informations issues de l'environnement de requête afin de régler les noms de
contrôleur et d'action.
</para>
<para>
Par défaut, <classname>Zend_Controller_Request_Http</classname> est employé,
ce qui permet d'accéder à l'environnement complet de requête <acronym>HTTP</acronym>.
</para>
</listitem>
<listitem>
<para>
<classname>Zend_Controller_Router_Interface</classname> est employé pour
définir les routeurs. Le routage est le processus d'examen de l'environnement de
requête pour déterminer quel contrôleur, et action de ce contrôleur, devraient
recevoir la requête. Ces contrôleur, action, et paramètres facultatifs sont alors
placés dans l'objet de requête à traiter par
<classname>Zend_Controller_Dispatcher_Standard</classname>. Le routage se produit
seulement une fois : quand la demande est initialement reçue et avant que le
premier contrôleur ne soit distribué.
</para>
<para>
Le routeur par défaut, <classname>Zend_Controller_Router_Rewrite</classname>,
récupère un <acronym>URI</acronym> comme indiqué dans
<classname>Zend_Controller_Request_Http</classname> et le décompose en contrôleur,
action, et paramètres basés sur l'information de chemin de l'URL. Par exemple,
l'URL <code>http://localhost/foo/bar/key/value</code> serait décodée pour employer
le contrôleur <code>foo</code>, l'action <code>bar</code>, et pour indiquer un
paramètre <code>key</code> avec une valeur <code>value</code>.
</para>
<para>
<classname>Zend_Controller_Router_Rewrite</classname> peut également être
utilisé pour faire correspondre des chemins arbitraires ; voir
<link linkend="zend.controller.router">la documentation du routeur</link>pour plus
d'information.
</para>
</listitem>
<listitem>
<para>
<classname>Zend_Controller_Dispatcher_Interface</classname> est utilisé pour
définir les distributeurs. La distribution est le processus chargé de récupérer le
contrôleur et l'action issus de l'objet de requête et de les faire correspondre à
un fichier/classe de contrôleur et à une méthode d'action dans la classe du
contrôleur. Si le contrôleur ou l'action n'existent pas, il se charge de déterminer
des contrôleurs et des actions par défaut à distribuer.
</para>
<para>
Le processus de distribution réel se compose de l'instanciation de la classe
de contrôleur et de l'appel de la méthode d'action dans cette classe. A la
différence du routage, qui se produit seulement une fois, la distribution se
produit dans une boucle. Si le statut distribué de l'objet de requête est remis à
zéro à un moment quelconque, la boucle sera répétée, en appelant l'action
actuellement placée dans l'objet de requête. La première fois que la boucle se
termine avec une propriété de statut d'objet de requête distribué à vrai (booléen
<constant>TRUE</constant>), le processus s'arrête.
</para>
<para>
Le distributeur par défaut est
<classname>Zend_Controller_Dispatcher_Standard</classname>. Il définit les
contrôleurs comme des classes pouvant se nommer avec une série de caractère
majuscules et/ou minuscules et se terminant par le mot <code>Controller</code>, et
des méthodes d'action suivant la notationCamel se terminant avec le mot Action :
<methodname>FooController::barAction()</methodname>. Dans ce cas-ci, le contrôleur est désigné
comme <code>foo</code> et l'action comme <code>bar</code>.
</para>
<note>
<title>Conventions de nommage (casse)</title>
<para>
Puisque les humains sont notoirement incompatibles avec le respect des
majuscules et des minuscules quand ils tapent des liens, Zend Framework
normalise les chemins en lettres minuscules. Ceci, naturellement, affectera
votre manière d'appeler vos contrôleurs et actions... ou vous vous référez à
eux dans les liens.
</para>
<para>
Si vous souhaitez que votre classe ou action de contrôleur ait de
multiples motsEnCassesMélangées ou motsEnNotationCamel, vous devrez séparer ces
mots dans l'URL avec soit un tiret ("-"), soit un point (".") (bien que vous
puissiez configurer le caractère utilisé).
</para>
<para>
Par exemple, si vous souhaitez l'action
<methodname>FooBarController::bazBatAction()</methodname>, vous vous referez à elle avec
l'URL <code>/foo-bar/baz-bat</code> ou <code>/foo.bar/baz.bat</code>.
</para>
</note>
</listitem>
<listitem>
<para>
<classname>Zend_Controller_Action</classname> est le composant contrôleur
d'action de base. Chaque contrôleur est une classe simple qui étend la classe de
<classname>Zend_Controller_Action</classname> et devrait contenir une ou plusieurs
méthodes d'action.
</para>
</listitem>
<listitem>
<para>
<classname>Zend_Controller_Response_Abstract</classname> définit une classe
de réponse de base employée pour rassembler et retourner les réponses des
contrôleurs d'action. Il rassemble les en-têtes et le contenu du corps.
</para>
<para>
La classe de réponse par défaut est
<classname>Zend_Controller_Response_Http</classname>, qui convient pour l'usage
dans un environnement <acronym>HTTP</acronym>.
</para>
</listitem>
</itemizedlist>
<para>
Le déroulement des opérations de <classname>Zend_Controller</classname> est
relativement simple. Une demande est reçue par
<classname>Zend_Controller_Front</classname>, qui appelle alternativement
<classname>Zend_Controller_Router_Rewrite</classname> pour déterminer le contrôleur (et
l'action dans ce contrôleur) à distribuer.
<classname>Zend_Controller_Router_Rewrite</classname> décompose l'URI afin de régler les
noms de contrôleur et d'action dans la requête.
<classname>Zend_Controller_Front</classname> entre alors dans une boucle de distribution.
Il appelle <classname>Zend_Controller_Dispatcher_Standard</classname>, en lui passant la
requête, pour distribuer le contrôleur et l'action indiqués dans la requête (ou utiliser
les valeurs par défaut). Après que le contrôleur ait fini, la commande revient à
<classname>Zend_Controller_Front</classname>. Si le contrôleur a indiqué qu'un autre
contrôleur devait être distribué en remettant à zéro le statut distribué de la requête, la
boucle continue et une autre distribution est effectuée. Sinon, le processus se
termine.
</para>
</sect1>
|