Zend_Controller-Request.xml 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- EN-Revision: 17597 -->
  3. <!-- Reviewed: no -->
  4. <sect1 id="zend.controller.request">
  5. <title>La solicitud del Objeto</title>
  6. <sect2 id="zend.controller.request.introduction">
  7. <title>Introducción</title>
  8. <para>
  9. El objeto request es un objeto de valor simple que es pasado
  10. entre
  11. <classname>Zend_Controller_Front</classname>
  12. y el router,
  13. dispatcher, y clases de controlador. Empaqueta los nombres del
  14. módulo
  15. solicitado, controlador, acción, y los parámetros opcionales,
  16. así como el resto del
  17. entorno de la solicitud, ya sea
  18. <acronym>HTTP</acronym>
  19. , el
  20. <acronym>CLI</acronym>
  21. , o
  22. <acronym>PHP</acronym>
  23. -GTK.
  24. </para>
  25. <itemizedlist>
  26. <listitem>
  27. <para>
  28. El nombre del módulo es accedido por
  29. <methodname>getModuleName()</methodname>
  30. y
  31. <methodname>setModuleName()</methodname>
  32. .
  33. </para>
  34. </listitem>
  35. <listitem>
  36. <para>
  37. El nombre del controlador es accedido por
  38. <methodname>getControllerName()</methodname>
  39. y
  40. <methodname>setControllerName()</methodname>
  41. .
  42. </para>
  43. </listitem>
  44. <listitem>
  45. <para>
  46. El nombre de la acción que llamar dentro del controlador
  47. es accedido por
  48. <methodname>getActionName()</methodname>
  49. y
  50. <methodname>setActionName()</methodname>
  51. .
  52. </para>
  53. </listitem>
  54. <listitem>
  55. <para>
  56. Los parámetros accesibles por la acción son un array
  57. asociativo de pares
  58. clave/valor que son recuperados por
  59. <methodname>getParams()</methodname>
  60. y configurados con
  61. <methodname>setParams()</methodname>
  62. , o configurados
  63. individualmente por
  64. <methodname>getParam()</methodname>
  65. y
  66. <methodname>setParam()</methodname>
  67. .
  68. </para>
  69. </listitem>
  70. </itemizedlist>
  71. <para>
  72. Basado en el tipo de solicitud, puede haber más métodos
  73. disponibles. La solicitud por
  74. defecto usada,
  75. <classname>Zend_Controller_Request_Http</classname>
  76. , por
  77. ejemplo, tiene métodos para recuperar la
  78. <acronym>URI</acronym>
  79. de
  80. la solicitud, ruta de la información, parámetros
  81. <varname>$_GET</varname>
  82. y
  83. <varname>$_POST</varname>
  84. , etc.
  85. </para>
  86. <para>El objeto request es pasado al controlador front, o si no es
  87. provisto, es instanciado
  88. al principio del proceso dispatcher, antes
  89. de que ocurra el enrutamiento. Es pasado a
  90. través de todos los
  91. objetos en la cadena del dispatcher.</para>
  92. <para>
  93. Adicionalmente, la solicitud objeto es particularmente útil en
  94. pruebas. El desarrolador
  95. puede cambiar el entorno de la solicitud,
  96. incluyendo módulos, controladores, acciones,
  97. parámetros,
  98. <acronym>URI</acronym>
  99. , etc, y pasar la solicitud objeto al
  100. controlador front para probar el flujo de la
  101. aplicación. Cuando se
  102. vincula con el
  103. <link linkend="zend.controller.response">objeto
  104. respuesta </link>
  105. , es posible elaborar y precisar una unidad de
  106. pruebas de aplicaciones
  107. <acronym>MVC</acronym>
  108. .
  109. </para>
  110. </sect2>
  111. <sect2 id="zend.controller.request.http">
  112. <title>Solicitud HTTP</title>
  113. <sect3 id="zend.controller.request.http.dataacess">
  114. <title>Solicitud de acceso a datos</title>
  115. <para>
  116. <classname>Zend_Controller_Request_Http</classname>
  117. encapsula el
  118. acceso a relevantes valores tal como el nombre de la llave y el
  119. valor
  120. para el controlador y variables de aación enrutamiento y
  121. todos los parámetros
  122. adicionales analizados desde el
  123. <acronym>URI</acronym>
  124. . Adiccionalmente permite el acceso a
  125. valores contenidos en las superglobales como
  126. miembros públicos y
  127. administra la actual base
  128. <acronym>URL</acronym>
  129. y la solicitud
  130. <acronym>URI</acronym>
  131. . los valores Superglobales no pueden
  132. ser determinados en una solicitud objeto, en
  133. vez usar los
  134. métodos
  135. <methodname>setParam()</methodname>
  136. y
  137. <methodname>getParam()</methodname>
  138. para determinar o
  139. recuperar los parámetros del usuario.
  140. </para>
  141. <note>
  142. <title>Datos Superglobales</title>
  143. <para>
  144. Cuando se accede a datos Superglobales a través
  145. <classname>Zend_Controller_Request_Http</classname>
  146. como
  147. propiedades de miembros públicos, es necesario mantener en
  148. mente que el
  149. nombre de la propiedad (supergloabl array key)
  150. corresponda a una supergloabl en
  151. un específico orden de
  152. precedencia:1.
  153. <constant>GET</constant>
  154. , 2.
  155. <constant>POST</constant>
  156. , 3.
  157. <constant>COOKIE</constant>
  158. , 4.
  159. <constant>SERVER</constant>
  160. , 5.
  161. <constant>ENV</constant>
  162. .
  163. </para>
  164. </note>
  165. <para>
  166. Las supergloables específicas pueden ser accedidas usando un
  167. método público como una
  168. alternativa. Por ejemplo, el valor
  169. original de
  170. <varname>$_POST['user']</varname>
  171. puede ser accedido
  172. llamando a
  173. <methodname>getPost('user')</methodname>
  174. en la
  175. solicitud objeto. Esto incluye
  176. <methodname>getQuery()</methodname>
  177. para recuperar elementos
  178. <varname>$_GET</varname>
  179. , y
  180. <methodname>getHeader()</methodname>
  181. para recuperar la
  182. solicitud de los encabezadores (headers).
  183. </para>
  184. <note>
  185. <title>Datos GET y POST</title>
  186. <para>Sea cauteloso cuando accede a los datos de la solicitud
  187. objeto como no es
  188. filtrado en ninguna manera. El router y
  189. dispatcher valida y filtra datos para
  190. usar con sus tareas,
  191. pero dejan los datos intactos en la solicitud objeto.
  192. </para>
  193. </note>
  194. <note>
  195. <title>Recuperando los datos POST sin procesar</title>
  196. <para>
  197. Como 1.5.0, se puede recuperar los datos sin procesar a
  198. través del método
  199. <methodname>getRawBody()</methodname>
  200. .
  201. Este método retorna falso si los datos han sido enviados de
  202. esa manera, pero si
  203. no retorna el cuerpo entero del post.
  204. </para>
  205. <para>
  206. Esto es primordialmente útil para aceptar el contenido
  207. cuando se desarrolla una
  208. aplicación
  209. <acronym>MVC</acronym>
  210. simple.
  211. </para>
  212. </note>
  213. <para>
  214. Usted puede determinar parámetros de usuario en la solicitud
  215. objeto usando
  216. <methodname>setParam()</methodname>
  217. y recuperar
  218. los mismos despues usando
  219. <methodname>getParam()</methodname>
  220. .
  221. El router hace uso de esta funcionalidad para determinar
  222. parámetros correspondientes
  223. en la solicitud
  224. <acronym>URI</acronym>
  225. a la solicitud objeto.
  226. </para>
  227. <note>
  228. <title>getParam() Recupera mas que Parámetros de Usuario</title>
  229. <para>
  230. En orden para hacer el mismo trabajo,
  231. <methodname>getParam()</methodname>
  232. recupera actualmente
  233. desde muchas fuentes. En orden de prioridad, estas incluyen:
  234. parámetros de usuario determinados a través de
  235. <methodname>setParam()</methodname>
  236. , parámetros
  237. <constant>GET</constant>
  238. , y finalmente parámetros
  239. <constant>POST</constant>
  240. . Ser conciente de esto cuando
  241. se sacan datos a través de este método.
  242. </para>
  243. <para>
  244. Si se desea sacar solo desde parámetros se configura a
  245. través de
  246. <methodname>setParam()</methodname>
  247. , use
  248. <methodname>getUserParam()</methodname>
  249. .
  250. </para>
  251. <para>
  252. Además, a partir de 1.5.0, puede bloquear el parámetro
  253. que se buscará en las
  254. fuentes.
  255. <methodname>setParamSources()</methodname>
  256. le permite
  257. especificar un array vacío o un array con uno o más de los
  258. valores
  259. '_GET' o '_POST', indicando que fuente de parámetro
  260. se permite (por defecto,
  261. ambos son permitidos); si se desea
  262. restringir el acceso a solamente '_GET'
  263. especificar
  264. <methodname>setParamSources
  265. (array('_GET'))</methodname>
  266. .
  267. </para>
  268. </note>
  269. <note>
  270. <title>Apache Quirks</title>
  271. <para>
  272. Si está usando Apache 404 handler para pasar If you are
  273. using Apache's 404
  274. handler to pass incoming requests to the
  275. front controller, or using a PT flag
  276. with rewrite rules,
  277. <varname>$_SERVER['REDIRECT_URL']</varname>
  278. contains the
  279. <acronym>URI</acronym>
  280. you need, not
  281. <varname>$_SERVER['REQUEST_URI']</varname>
  282. . If you are
  283. using such a setup and getting invalid routing, you should
  284. use the
  285. <classname>Zend_Controller_Request_Apache404</classname>
  286. class instead of the default
  287. <acronym>HTTP</acronym>
  288. class for your request
  289. object:
  290. </para>
  291. <programlisting language="php"><![CDATA[
  292. $request = new Zend_Controller_Request_Apache404();
  293. $front->setRequest($request);
  294. ]]></programlisting>
  295. <para>
  296. This class extends the
  297. <classname>Zend_Controller_Request_Http</classname>
  298. class and simply modifies the autodiscovery of the request
  299. URI. It can be used as
  300. a drop-in replacement.
  301. </para>
  302. </note>
  303. </sect3>
  304. <sect3 id="zend.controller.request.http.baseurl">
  305. <title>Base Url and Subdirectories</title>
  306. <para>
  307. <classname>Zend_Controller_Request_Http</classname>
  308. allows
  309. <classname>Zend_Controller_Router_Rewrite</classname>
  310. to be
  311. used in subdirectories.
  312. <classname>Zend_Controller_Request_Http</classname>
  313. will
  314. attempt to automatically detect your base
  315. <acronym>URL</acronym>
  316. and set it accordingly.
  317. </para>
  318. <para>
  319. For example, if you keep your
  320. <filename>index.php</filename>
  321. in a webserver subdirectory named
  322. <filename>/projects/myapp/index.php</filename>
  323. , base
  324. <acronym>URL</acronym>
  325. (rewrite base) should be set to
  326. <filename>/projects/myapp</filename>
  327. . This string will
  328. then be stripped from the beginning of the path before
  329. calculating
  330. any route matches. This frees one from the necessity
  331. of prepending it to any of your
  332. routes. A route of
  333. <command>'user/:username'</command>
  334. will match
  335. <acronym>URI</acronym>
  336. s like
  337. <filename>http://localhost/projects/myapp/user/martel</filename>
  338. and
  339. <filename>http://example.com/user/martel</filename>
  340. .
  341. </para>
  342. <note>
  343. <title>URL Detection is Case Sensitive</title>
  344. <para>
  345. Automatic base
  346. <acronym>URL</acronym>
  347. detection is case
  348. sensitive, so make sure your
  349. <acronym>URL</acronym>
  350. will
  351. match a subdirectory name in a filesystem (even on Windows
  352. machines). If it
  353. doesn't, an exception will be raised.
  354. </para>
  355. </note>
  356. <para>
  357. Should base
  358. <acronym>URL</acronym>
  359. be detected incorrectly
  360. you can override it with your own base path with the help of
  361. the
  362. <methodname>setBaseUrl()</methodname>
  363. method of either the
  364. <classname>Zend_Controller_Request_Http</classname>
  365. class,
  366. or the
  367. <classname>Zend_Controller_Front</classname>
  368. class. The
  369. easiest method is to set it in
  370. <classname>Zend_Controller_Front</classname>
  371. , which will
  372. proxy it into the request object. Example usage to set a custom
  373. base
  374. <acronym>URL</acronym>
  375. :
  376. </para>
  377. <programlisting language="php"><![CDATA[
  378. /**
  379. * Dispatch Request with custom base URL with Zend_Controller_Front.
  380. */
  381. $router = new Zend_Controller_Router_Rewrite();
  382. $controller = Zend_Controller_Front::getInstance();
  383. $controller->setControllerDirectory('./application/controllers')
  384. ->setRouter($router)
  385. ->setBaseUrl('/projects/myapp'); // set the base url!
  386. $response = $controller->dispatch();
  387. ]]></programlisting>
  388. </sect3>
  389. <sect3 id="zend.controller.request.http.method">
  390. <title>Determining the Request Method</title>
  391. <para>
  392. <methodname>getMethod()</methodname>
  393. allows you to determine the
  394. <acronym>HTTP</acronym>
  395. request method used to request the
  396. current resource. Additionally, a variety of
  397. methods exist that
  398. allow you to get boolean responses when asking if a specific
  399. type
  400. of request has been made:
  401. </para>
  402. <itemizedlist>
  403. <listitem>
  404. <para>
  405. <methodname>isGet()</methodname>
  406. </para>
  407. </listitem>
  408. <listitem>
  409. <para>
  410. <methodname>isPost()</methodname>
  411. </para>
  412. </listitem>
  413. <listitem>
  414. <para>
  415. <methodname>isPut()</methodname>
  416. </para>
  417. </listitem>
  418. <listitem>
  419. <para>
  420. <methodname>isDelete()</methodname>
  421. </para>
  422. </listitem>
  423. <listitem>
  424. <para>
  425. <methodname>isHead()</methodname>
  426. </para>
  427. </listitem>
  428. <listitem>
  429. <para>
  430. <methodname>isOptions()</methodname>
  431. </para>
  432. </listitem>
  433. </itemizedlist>
  434. <para>
  435. The primary use case for these is for creating RESTful
  436. <acronym>MVC</acronym>
  437. architectures.
  438. </para>
  439. </sect3>
  440. <sect3 id="zend.controller.request.http.ajax">
  441. <title>Detecting AJAX Requests</title>
  442. <para>
  443. <classname>Zend_Controller_Request_Http</classname>
  444. has a
  445. rudimentary method for detecting
  446. <acronym>AJAX</acronym>
  447. requests:
  448. <methodname>isXmlHttpRequest()</methodname>
  449. . This
  450. method looks for an
  451. <acronym>HTTP</acronym>
  452. request header
  453. <emphasis>X-Requested-With</emphasis>
  454. with the value
  455. 'XMLHttpRequest'; if found, it returns
  456. <constant>TRUE</constant>
  457. .
  458. </para>
  459. <para>Currently, this header is known to be passed by default with
  460. the following JS
  461. libraries:</para>
  462. <itemizedlist>
  463. <listitem>
  464. <para>Prototype/Scriptaculous (and libraries derived from
  465. Prototype)</para>
  466. </listitem>
  467. <listitem>
  468. <para>Yahoo! UI Library</para>
  469. </listitem>
  470. <listitem>
  471. <para>jQuery</para>
  472. </listitem>
  473. <listitem>
  474. <para>MochiKit</para>
  475. </listitem>
  476. </itemizedlist>
  477. <para>
  478. Most
  479. <acronym>AJAX</acronym>
  480. libraries allow you to send
  481. custom
  482. <acronym>HTTP</acronym>
  483. request headers; if your library does not send this
  484. header, simply add it as a
  485. request header to ensure the
  486. <methodname>isXmlHttpRequest()</methodname>
  487. method works for
  488. you.
  489. </para>
  490. </sect3>
  491. </sect2>
  492. <sect2 id="zend.controller.request.subclassing">
  493. <title>Subclassing the Request Object</title>
  494. <para>
  495. The base request class used for all request objects is the
  496. abstract class
  497. <classname>Zend_Controller_Request_Abstract</classname>
  498. . At its
  499. most basic, it defines the following methods:
  500. </para>
  501. <programlisting language="php"><![CDATA[
  502. abstract class Zend_Controller_Request_Abstract
  503. {
  504. /**
  505. * @return string
  506. */
  507. public function getControllerName();
  508. /**
  509. * @param string $value
  510. * @return self
  511. */
  512. public function setControllerName($value);
  513. /**
  514. * @return string
  515. */
  516. public function getActionName();
  517. /**
  518. * @param string $value
  519. * @return self
  520. */
  521. public function setActionName($value);
  522. /**
  523. * @return string
  524. */
  525. public function getControllerKey();
  526. /**
  527. * @param string $key
  528. * @return self
  529. */
  530. public function setControllerKey($key);
  531. /**
  532. * @return string
  533. */
  534. public function getActionKey();
  535. /**
  536. * @param string $key
  537. * @return self
  538. */
  539. public function setActionKey($key);
  540. /**
  541. * @param string $key
  542. * @return mixed
  543. */
  544. public function getParam($key);
  545. /**
  546. * @param string $key
  547. * @param mixed $value
  548. * @return self
  549. */
  550. public function setParam($key, $value);
  551. /**
  552. * @return array
  553. */
  554. public function getParams();
  555. /**
  556. * @param array $array
  557. * @return self
  558. */
  559. public function setParams(array $array);
  560. /**
  561. * @param boolean $flag
  562. * @return self
  563. */
  564. public function setDispatched($flag = true);
  565. /**
  566. * @return boolean
  567. */
  568. public function isDispatched();
  569. }
  570. ]]></programlisting>
  571. <para>La solicitud objeto es un contenedor para entorno de la
  572. solicitud. La cadena del
  573. controlador sólo necesita saber cómo
  574. establecer y recuperar el controlador, la acción,
  575. los parámetros
  576. opcionales, y el estado del despachador. Por defecto, la solicitud
  577. buscará
  578. sus propios parámetros mediante el controlador o las llaves
  579. de la acción con el fin de
  580. determinar el controlador y la acción.</para>
  581. <para>
  582. Para ampliar esta clase, o uno de sus derivados, cuando se
  583. necesita la clase solicitud
  584. que interactue con un entorno específico
  585. con el fin de recuperar los datos para su uso en
  586. las tareas antes
  587. descritas. Los ejemplos incluyen
  588. <link linkend="zend.controller.request.http">
  589. el entorno
  590. <acronym>HTTP</acronym>
  591. </link>
  592. , un entorno
  593. <acronym>CLI</acronym>
  594. , o un entorno de
  595. <acronym>PHP</acronym>
  596. -GTK.
  597. </para>
  598. </sect2>
  599. </sect1>