Zend_Controller-Request.xml 19 KB

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