Zend_Controller-Request.xml 18 KB

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