Zend_Controller-Request.xml 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <!-- EN-Revision: 24827 -->
  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. <note>
  226. <title>Fully-Qualified URL is not supported</title>
  227. <para>
  228. Passing a fully-qualified URL (ie: http://example.com/) to the
  229. <methodname>setBaseUrl</methodname> method is not supported, and
  230. will cause issues for both the usage describe above and when using
  231. the URL view helper. See ticket
  232. <ulink url="http://framework.zend.com/issues/browse/ZF-10923">
  233. ZF-10923
  234. </ulink> for more details.
  235. </para>
  236. </note>
  237. </sect3>
  238. <sect3 id="zend.controller.request.http.method">
  239. <title>Déterminer le type de la requête</title>
  240. <para>
  241. <methodname>getMethod()</methodname> vous permet de déterminer le type de requête <acronym>HTTP</acronym>
  242. utiliser pour appeler la ressource courante. De plus, différentes méthodes existent
  243. pour récupérer sous la forme de booléen le type de requête réalisée&#160;:
  244. </para>
  245. <itemizedlist>
  246. <listitem>
  247. <para><methodname>isGet()</methodname></para>
  248. </listitem>
  249. <listitem>
  250. <para><methodname>isPost()</methodname></para>
  251. </listitem>
  252. <listitem>
  253. <para><methodname>isPut()</methodname></para>
  254. </listitem>
  255. <listitem>
  256. <para><methodname>isDelete()</methodname></para>
  257. </listitem>
  258. <listitem>
  259. <para><methodname>isHead()</methodname></para>
  260. </listitem>
  261. <listitem>
  262. <para><methodname>isOptions()</methodname></para>
  263. </listitem>
  264. </itemizedlist>
  265. <para>
  266. La principale utilisation est lors de la création des architectures <acronym>MVC</acronym> de
  267. type REST.
  268. </para>
  269. </sect3>
  270. <sect3 id="zend.controller.request.http.ajax">
  271. <title>Détecter les requêtes AJAX</title>
  272. <para>
  273. <classname>Zend_Controller_Request_Http</classname> possède une méthode
  274. rudimentaire pour détecter les requêtes <acronym>AJAX</acronym>&#160;:
  275. <methodname>isXmlHttpRequest()</methodname>.
  276. Cette méthode parcourt les en-têtes de la requête <acronym>HTTP</acronym> à la recherche de
  277. <emphasis>X-Requested-With</emphasis> ayant la valeur "XMLHttpRequest"&#160;; si celui-ci
  278. est trouvé, la méthode retourne <constant>TRUE</constant>.
  279. </para>
  280. <para>
  281. Actuellement, on sait que cet en-tête est fourni par défaut par les
  282. bibliothèques JS suivantes&#160;:
  283. </para>
  284. <itemizedlist>
  285. <listitem>
  286. <para>Prototype et Scriptaculous (et les librairies dérivées de Prototype)</para>
  287. </listitem>
  288. <listitem>
  289. <para>Yahoo! UI Library</para>
  290. </listitem>
  291. <listitem>
  292. <para>jQuery</para>
  293. </listitem>
  294. <listitem>
  295. <para>MochiKit</para>
  296. </listitem>
  297. </itemizedlist>
  298. <para>
  299. La plupart des librairies <acronym>AJAX</acronym> vous permettent d'envoyer vos propres en-têtes
  300. de requête <acronym>HTTP</acronym> ; si votre librairie n'envoie pas cet en-tête, ajoutez le
  301. simplement afin d'être sûr que la méthode <methodname>isXmlHttpRequest()</methodname>
  302. fonctionne dans votre cas.
  303. </para>
  304. </sect3>
  305. </sect2>
  306. <sect2 id="zend.controller.request.subclassing">
  307. <title>Sous-classer l'objet Requête</title>
  308. <para>
  309. La classe de requête de base utilisée pour tous les objets de requête est la
  310. classe abstraite <classname>Zend_Controller_Request_Abstract</classname>. Au minimum,
  311. elle définit les méthodes suivantes&#160;:
  312. </para>
  313. <programlisting language="php"><![CDATA[
  314. abstract class Zend_Controller_Request_Abstract
  315. {
  316. /**
  317. * @return string
  318. */
  319. public function getControllerName();
  320. /**
  321. * @param string $value
  322. * @return self
  323. */
  324. public function setControllerName($value);
  325. /**
  326. * @return string
  327. */
  328. public function getActionName();
  329. /**
  330. * @param string $value
  331. * @return self
  332. */
  333. public function setActionName($value);
  334. /**
  335. * @return string
  336. */
  337. public function getControllerKey();
  338. /**
  339. * @param string $key
  340. * @return self
  341. */
  342. public function setControllerKey($key);
  343. /**
  344. * @return string
  345. */
  346. public function getActionKey();
  347. /**
  348. * @param string $key
  349. * @return self
  350. */
  351. public function setActionKey($key);
  352. /**
  353. * @param string $key
  354. * @return mixed
  355. */
  356. public function getParam($key);
  357. /**
  358. * @param string $key
  359. * @param mixed $value
  360. * @return self
  361. */
  362. public function setParam($key, $value);
  363. /**
  364. * @return array
  365. */
  366. public function getParams();
  367. /**
  368. * @param array $array
  369. * @return self
  370. */
  371. public function setParams(array $array);
  372. /**
  373. * @param boolean $flag
  374. * @return self
  375. */
  376. public function setDispatched($flag = true);
  377. /**
  378. * @return boolean
  379. */
  380. public function isDispatched();
  381. }
  382. ]]></programlisting>
  383. <para>
  384. L'objet de requête est un conteneur pour l'environnement de la requête. La chaîne
  385. de contrôleur doit seulement savoir régler et récupérer le contrôleur, l'action, les
  386. paramètres facultatifs, et le statut distribué. Par défaut, la demande recherchera ses
  387. propres paramètres en utilisant les clés de contrôleur ou d'action afin de déterminer
  388. le contrôleur et l'action.
  389. </para>
  390. <para>
  391. Étendez cette classe, ou une de ses dérivés, quand vous avez besoin de la classe
  392. de requête pour interagir avec un environnement spécifique afin de récupérer des
  393. données pour les utiliser dans les tâches ci-dessus. Les exemples incluent
  394. <link linkend="zend.controller.request.http">l'environnement <acronym>HTTP</acronym></link>, un
  395. environnement <acronym>CLI</acronym>, ou un environnement <acronym>PHP</acronym>-GTK.
  396. </para>
  397. </sect2>
  398. </sect1>