Zend_Controller-Request.xml 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <!-- EN-Revision: 24249 -->
  3. <!-- Reviewed: no -->
  4. <sect1 id="zend.controller.request">
  5. <title>L'objet Requête</title>
  6. <sect2 id="zend.controller.request.introduction">
  7. <title>Introduction</title>
  8. <para>
  9. L'objet requête est un objet simple de valeur qui est passé entre
  10. <classname>Zend_Controller_Front</classname> et le routeur, le distributeur, et les
  11. classes de contrôleur. Il empaquette les noms du module demandé, du contrôleur, de
  12. l'action, et des paramètres facultatifs, aussi bien que le reste de l'environnement de
  13. requête, que ce soit le <acronym>HTTP</acronym>, du <acronym>CLI</acronym>, ou de
  14. <acronym>PHP</acronym>-GTK.
  15. </para>
  16. <itemizedlist>
  17. <listitem>
  18. <para>
  19. Le nom de module est accessible par <methodname>getModuleName()</methodname> et
  20. <methodname>setModuleName()</methodname>.
  21. </para>
  22. </listitem>
  23. <listitem>
  24. <para>
  25. Le nom de contrôleur est accessible par <methodname>getControllerName()</methodname>
  26. et <methodname>setControllerName()</methodname>.
  27. </para>
  28. </listitem>
  29. <listitem>
  30. <para>
  31. Le nom de l'action à appeler dans le contrôleur est accessible par
  32. <methodname>getActionName()</methodname> et <methodname>setActionName()</methodname>.
  33. </para>
  34. </listitem>
  35. <listitem>
  36. <para>
  37. Les paramètres accessibles par l'action sont dans un tableau associatif
  38. de paires clés et valeurs qui sont récupérables par <methodname>getParams()</methodname> et
  39. modifiables par <methodname>setParams()</methodname>, ou individuellement par
  40. <methodname>getParam()</methodname> et <methodname>setParam()</methodname>.
  41. </para>
  42. </listitem>
  43. </itemizedlist>
  44. <para>
  45. En fonction du type de requête, il peut y avoir plus de méthodes disponibles. La
  46. requête par défaut utilisée, <classname>Zend_Controller_Request_Http</classname>, par
  47. exemple, a des méthodes pour rechercher l'URI de la requête, l'information sur le
  48. chemin, les paramètres <varname>$_GET</varname> et <varname>$_POST</varname>, etc.
  49. </para>
  50. <para>
  51. L'objet requête est passé au contrôleur frontal, ou si aucun n'est fourni, il est
  52. instancié au début du processus de distribution, avant que le routage ne se produise.
  53. Il est passé à travers chaque objet dans la chaîne de distribution.
  54. </para>
  55. <para>
  56. De plus, l'objet requête est particulièrement utile pour les tests. Le
  57. développeur peut simuler l'environnement de requête, y compris le module, le
  58. contrôleur, l'action, les paramètres, l'URI, etc., et passe l'objet requête au
  59. contrôleur frontal pour tester une application. Une fois appairés avec
  60. <link linkend="zend.controller.response">l'objet réponse</link>, les tests unitaires
  61. élaboré et précis d'application <acronym>MVC</acronym> deviennent possible.
  62. </para>
  63. </sect2>
  64. <sect2 id="zend.controller.request.http">
  65. <title>Les requêtes HTTP</title>
  66. <sect3 id="zend.controller.request.http.dataacess">
  67. <title>Accéder aux données de la requête</title>
  68. <para>
  69. <classname>Zend_Controller_Request_Http</classname> encapsule l'accès aux
  70. valeurs appropriées telles que le nom de la clé et la valeur pour les variables
  71. contrôleur d'action et routeur , et tous les paramètres additionnels analysés à
  72. partir de l'URI. Il permet en plus l'accès aux valeurs contenues dans les
  73. superglobales en tant que membres publics, et contrôle l'URL de base et l'URI
  74. courants de la requête. Des valeurs superglobales ne peuvent pas être placées dans
  75. un objet requête, au lieu de cela utilisez les méthodes
  76. <methodname>setParam()</methodname> et <methodname>getParam()</methodname> pour
  77. régler ou pour récupérer des paramètres d'utilisateur.
  78. </para>
  79. <note>
  80. <title>Données superglobales</title>
  81. <para>
  82. En accédant à des données superglobales par
  83. <classname>Zend_Controller_Request_Http</classname> en tant que propriétés
  84. publiques de membre, il est nécessaire de maintenir dans l'esprit que le nom de
  85. propriété (clé du tableau des superglobales) est assorti à une superglobale
  86. dans un ordre spécifique de priorité&#160;: 1.&#160;<constant>GET</constant>,
  87. 2.&#160;<constant>POST</constant>, 3.&#160;<constant>COOKIE</constant>,
  88. 4.&#160;<constant>SERVER</constant>, 5.&#160;<constant>ENV</constant>.
  89. </para>
  90. </note>
  91. <para>
  92. Des superglobales spécifiques peuvent être accédées en utilisant une méthode
  93. publique comme alternative. Par exemple, la valeur directe
  94. <varname>$_POST['user']</varname> peut être accédée en appelant
  95. <methodname>getPost('user')</methodname> sur l'objet de requête. Ceci inclue
  96. <methodname>getQuery()</methodname> pour rechercher des éléments $<varname>$_GET</varname>, et
  97. <methodname>getHeader()</methodname> pour récupérer les en-têtes de la requête.
  98. </para>
  99. <note>
  100. <title>Données GET et POST</title>
  101. <para>
  102. Soyez prudent en accédant à des données de l'objet de requête car il
  103. n'est pas du tout filtré. Le routeur et le distributeur valident et filtrent
  104. les données pour leur usage, mais laissent les données intactes dans l'objet de
  105. requête.
  106. </para>
  107. </note>
  108. <note>
  109. <title>Récupérer les données POST brutes</title>
  110. <para>
  111. A partir de la version 1.5.0, vous pouvez aussi les données POST brutes
  112. avec la méthode <methodname>getRawBody()</methodname>. La méthode retourne
  113. <constant>FALSE</constant> si aucune donnée n'a été envoyé, et le corps complet du POST
  114. sinon.
  115. </para>
  116. <para>
  117. Ceci est principalement utile pour accepter le contenu lors du
  118. développement des applications <acronym>MVC</acronym> de type REST.
  119. </para>
  120. </note>
  121. <para>
  122. Vous pouvez également placer des paramètres d'utilisateur dans l'objet de
  123. requête en utilisant <methodname>setParam()</methodname> et récupérer ces derniers en utilisant
  124. plus tard <methodname>getParam()</methodname>. Le routeur se sert de cette fonctionnalité pour
  125. faire correspondre des paramètres de l'URI de la requête dans l'objet
  126. requête.
  127. </para>
  128. <note>
  129. <title>getParam() retrouve plus que les paramètres d'utilisateur</title>
  130. <para>
  131. Afin d'effectuer une partie de son travail, <methodname>getParam()</methodname>
  132. recherche réellement dans plusieurs sources. Dans l'ordre de priorité, ceux-ci
  133. incluent&#160;: l'ensemble de paramètres d'utilisateur réglés par
  134. l'intermédiaire de <methodname>setParam()</methodname>, les paramètres <constant>GET</constant>, et
  135. finalement les paramètres <constant>POST</constant>. Faites attention à ceci lorsque
  136. vous récupérez des données par l'intermédiaire de cette méthode.
  137. </para>
  138. <para>
  139. Si vous souhaitez rechercher seulement dans les valeurs que vous avez
  140. paramétrées avec <methodname>setParam()</methodname>, utilisez
  141. <methodname>getUserParam()</methodname>.
  142. </para>
  143. <para>
  144. De plus, à partir de la version 1.5.0, vous pouvez verrouiller les
  145. sources de paramètres à utiliser. <methodname>setParamSources()</methodname> vous permet de
  146. spécifier un tableau vide ou un tableau contenant une ou plusieurs des valeurs
  147. "_GET" ou "_POST" indiquant quelle source de paramètres est autorisée (par
  148. défaut les deux sont autorisées)&#160;; si vous souhaitez restreindre l'accès
  149. seulement à "_GET", spécifiez
  150. <methodname>setParamSources(array('_GET'))</methodname>.
  151. </para>
  152. </note>
  153. <note>
  154. <title>Caprices d'Apache</title>
  155. <para>
  156. Si vous utilisez le gestionnaire 404 d'Apache pour passer les requêtes
  157. entrantes au contrôleur frontal, ou si vous utilisez le drapeau PT avec les
  158. règles de ré-écriture, <varname>$_SERVER['REDIRECT_URL']</varname> contient l'URI
  159. dont vous avez besoin, pas <varname>$_SERVER['REQUEST_URI']</varname>. Si vous
  160. employez une telle installation et obtenez un routage invalide, vous devriez
  161. employer la classe <classname>Zend_Controller_Request_Apache404</classname> au
  162. lieu de la classe <acronym>HTTP</acronym> par défaut pour votre objet de requête&#160;:
  163. </para>
  164. <programlisting language="php"><![CDATA[
  165. $request = new Zend_Controller_Request_Apache404();
  166. $front->setRequest($request);
  167. ]]></programlisting>
  168. <para>
  169. Cette classe étend la classe
  170. <classname>Zend_Controller_Request_Http</classname> et modifie simplement la
  171. recherche automatique de l'URI de la requête. Elle peut être employée comme un
  172. remplacement "drop-in".
  173. </para>
  174. </note>
  175. </sect3>
  176. <sect3 id="zend.controller.request.http.baseurl">
  177. <title>Base de l'URL et sous-dossiers</title>
  178. <para>
  179. <classname>Zend_Controller_Request_Http</classname> permet à
  180. <classname>Zend_Controller_Router_Rewrite</classname> d'être employé dans des
  181. sous-répertoires. <classname>Zend_Controller_Request_Http</classname> essayera de
  182. détecter automatiquement votre base d'URL et de la régler en conséquence.
  183. </para>
  184. <para>
  185. Par exemple, si vous maintenez votre <code>index.php</code> dans un
  186. sous-répertoire du serveur Web appelé <code>/projects/myapp/index.php</code>, la
  187. base d'URL (rewrite base) devrait être réglé à <code>/projects/myapp</code>. Cette
  188. chaîne sera alors dépouillée du début du chemin avant de calculer tous les routes
  189. correspondantes. Ceci libère de la nécessité de l'ajouter au début de n'importe
  190. laquelle de vos routes. Une route <code>'user/:username'</code> correspondra à des
  191. <acronym>URI</acronym> comme <code>http://localhost/projects/myapp/user/martel</code> et
  192. <code>http://example.com/user/martel</code>.
  193. </para>
  194. <note>
  195. <title>La détection d'URL est sensible à la casse</title>
  196. <para>
  197. La détection automatique d'URL de base est sensible à la casse, ainsi
  198. assurez vous que votre <acronym>URL</acronym> correspond à un nom de sous-répertoire dans le
  199. système de fichiers (même sur les machines Windows). S'il n'y en a pas, une
  200. exception sera levée.
  201. </para>
  202. </note>
  203. <para>
  204. Si la base de l'URL est détectée de manière inexacte vous pouvez la
  205. surcharger avec votre propre chemin de base grâce à la méthode
  206. <methodname>setBaseUrl()</methodname> soit de la classe de
  207. <classname>Zend_Controller_Request_Http</classname>, soit de la classe de
  208. <classname>Zend_Controller_Front</classname>. La méthode la plus facile est de la
  209. régler dans <classname>Zend_Controller_Front</classname>, qui le transmets dans
  210. l'objet de requête. Exemple d'utilisation pour régler une base d'URL
  211. personnalisée&#160;:
  212. </para>
  213. <programlisting language="php"><![CDATA[
  214. /**
  215. * Distribue la requête avec une base d'URL réglé
  216. * avec Zend_Controller_Front.
  217. */
  218. $router = new Zend_Controller_Router_Rewrite();
  219. $controller = Zend_Controller_Front::getInstance();
  220. $controller->setControllerDirectory('./application/controllers')
  221. ->setRouter($router)
  222. ->setBaseUrl('/projects/myapp'); // affecte la base d'url
  223. $response = $controller->dispatch();
  224. ]]></programlisting>
  225. </sect3>
  226. <sect3 id="zend.controller.request.http.method">
  227. <title>Déterminer le type de la requête</title>
  228. <para>
  229. <methodname>getMethod()</methodname> vous permet de déterminer le type de requête <acronym>HTTP</acronym>
  230. utiliser pour appeler la ressource courante. De plus, différentes méthodes existent
  231. pour récupérer sous la forme de booléen le type de requête réalisée&#160;:
  232. </para>
  233. <itemizedlist>
  234. <listitem>
  235. <para><methodname>isGet()</methodname></para>
  236. </listitem>
  237. <listitem>
  238. <para><methodname>isPost()</methodname></para>
  239. </listitem>
  240. <listitem>
  241. <para><methodname>isPut()</methodname></para>
  242. </listitem>
  243. <listitem>
  244. <para><methodname>isDelete()</methodname></para>
  245. </listitem>
  246. <listitem>
  247. <para><methodname>isHead()</methodname></para>
  248. </listitem>
  249. <listitem>
  250. <para><methodname>isOptions()</methodname></para>
  251. </listitem>
  252. </itemizedlist>
  253. <para>
  254. La principale utilisation est lors de la création des architectures <acronym>MVC</acronym> de
  255. type REST.
  256. </para>
  257. </sect3>
  258. <sect3 id="zend.controller.request.http.ajax">
  259. <title>Détecter les requêtes AJAX</title>
  260. <para>
  261. <classname>Zend_Controller_Request_Http</classname> possède une méthode
  262. rudimentaire pour détecter les requêtes <acronym>AJAX</acronym>&#160;:
  263. <methodname>isXmlHttpRequest()</methodname>.
  264. Cette méthode parcourt les en-têtes de la requête <acronym>HTTP</acronym> à la recherche de
  265. <emphasis>X-Requested-With</emphasis> ayant la valeur "XMLHttpRequest"&#160;; si celui-ci
  266. est trouvé, la méthode retourne <constant>TRUE</constant>.
  267. </para>
  268. <para>
  269. Actuellement, on sait que cet en-tête est fourni par défaut par les
  270. bibliothèques JS suivantes&#160;:
  271. </para>
  272. <itemizedlist>
  273. <listitem>
  274. <para>Prototype et Scriptaculous (et les librairies dérivées de Prototype)</para>
  275. </listitem>
  276. <listitem>
  277. <para>Yahoo! UI Library</para>
  278. </listitem>
  279. <listitem>
  280. <para>jQuery</para>
  281. </listitem>
  282. <listitem>
  283. <para>MochiKit</para>
  284. </listitem>
  285. </itemizedlist>
  286. <para>
  287. La plupart des librairies <acronym>AJAX</acronym> vous permettent d'envoyer vos propres en-têtes
  288. de requête <acronym>HTTP</acronym> ; si votre librairie n'envoie pas cet en-tête, ajoutez le
  289. simplement afin d'être sûr que la méthode <methodname>isXmlHttpRequest()</methodname>
  290. fonctionne dans votre cas.
  291. </para>
  292. </sect3>
  293. </sect2>
  294. <sect2 id="zend.controller.request.subclassing">
  295. <title>Sous-classer l'objet Requête</title>
  296. <para>
  297. La classe de requête de base utilisée pour tous les objets de requête est la
  298. classe abstraite <classname>Zend_Controller_Request_Abstract</classname>. Au minimum,
  299. elle définit les méthodes suivantes&#160;:
  300. </para>
  301. <programlisting language="php"><![CDATA[
  302. abstract class Zend_Controller_Request_Abstract
  303. {
  304. /**
  305. * @return string
  306. */
  307. public function getControllerName();
  308. /**
  309. * @param string $value
  310. * @return self
  311. */
  312. public function setControllerName($value);
  313. /**
  314. * @return string
  315. */
  316. public function getActionName();
  317. /**
  318. * @param string $value
  319. * @return self
  320. */
  321. public function setActionName($value);
  322. /**
  323. * @return string
  324. */
  325. public function getControllerKey();
  326. /**
  327. * @param string $key
  328. * @return self
  329. */
  330. public function setControllerKey($key);
  331. /**
  332. * @return string
  333. */
  334. public function getActionKey();
  335. /**
  336. * @param string $key
  337. * @return self
  338. */
  339. public function setActionKey($key);
  340. /**
  341. * @param string $key
  342. * @return mixed
  343. */
  344. public function getParam($key);
  345. /**
  346. * @param string $key
  347. * @param mixed $value
  348. * @return self
  349. */
  350. public function setParam($key, $value);
  351. /**
  352. * @return array
  353. */
  354. public function getParams();
  355. /**
  356. * @param array $array
  357. * @return self
  358. */
  359. public function setParams(array $array);
  360. /**
  361. * @param boolean $flag
  362. * @return self
  363. */
  364. public function setDispatched($flag = true);
  365. /**
  366. * @return boolean
  367. */
  368. public function isDispatched();
  369. }
  370. ]]></programlisting>
  371. <para>
  372. L'objet de requête est un conteneur pour l'environnement de la requête. La chaîne
  373. de contrôleur doit seulement savoir régler et récupérer le contrôleur, l'action, les
  374. paramètres facultatifs, et le statut distribué. Par défaut, la demande recherchera ses
  375. propres paramètres en utilisant les clés de contrôleur ou d'action afin de déterminer
  376. le contrôleur et l'action.
  377. </para>
  378. <para>
  379. Étendez cette classe, ou une de ses dérivés, quand vous avez besoin de la classe
  380. de requête pour interagir avec un environnement spécifique afin de récupérer des
  381. données pour les utiliser dans les tâches ci-dessus. Les exemples incluent
  382. <link linkend="zend.controller.request.http">l'environnement <acronym>HTTP</acronym></link>, un
  383. environnement <acronym>CLI</acronym>, ou un environnement <acronym>PHP</acronym>-GTK.
  384. </para>
  385. </sect2>
  386. </sect1>