Zend_Controller-Request.xml 18 KB

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