1 <?xml version="1.0" encoding="UTF-8"?>
2 <!-- EN-Revision: 17597 -->
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>
9 El objeto request es un objeto de valor simple que es pasado
11 <classname>Zend_Controller_Front</classname>
13 dispatcher, y clases de controlador. Empaqueta los nombres del
15 solicitado, controlador, acción, y los parámetros opcionales,
17 entorno de la solicitud, ya sea
18 <acronym>HTTP</acronym>
20 <acronym>CLI</acronym>
22 <acronym>PHP</acronym>
29 El nombre del módulo es accedido por
30 <methodname>getModuleName()</methodname>
32 <methodname>setModuleName()</methodname>
39 El nombre del controlador es accedido por
40 <methodname>getControllerName()</methodname>
42 <methodname>setControllerName()</methodname>
49 El nombre de la acción que llamar dentro del controlador
51 <methodname>getActionName()</methodname>
53 <methodname>setActionName()</methodname>
60 Los parámetros accesibles por la acción son un array
62 clave/valor que son recuperados por
63 <methodname>getParams()</methodname>
65 <methodname>setParams()</methodname>
68 <methodname>getParam()</methodname>
70 <methodname>setParam()</methodname>
77 Basado en el tipo de solicitud, puede haber más métodos
78 disponibles. La solicitud por
80 <classname>Zend_Controller_Request_Http</classname>
82 ejemplo, tiene métodos para recuperar la
83 <acronym>URI</acronym>
85 la solicitud, ruta de la información, parámetros
86 <varname>$_GET</varname>
88 <varname>$_POST</varname>
92 <para>El objeto request es pasado al controlador front, o si no es
93 provisto, es instanciado
94 al principio del proceso dispatcher, antes
95 de que ocurra el enrutamiento. Es pasado a
97 objetos en la cadena del dispatcher.</para>
100 Adicionalmente, la solicitud objeto es particularmente útil en
101 pruebas. El desarrolador
102 puede cambiar el entorno de la solicitud,
103 incluyendo módulos, controladores, acciones,
105 <acronym>URI</acronym>
106 , etc, y pasar la solicitud objeto al
107 controlador front para probar el flujo de la
108 aplicación. Cuando se
110 <link linkend="zend.controller.response">objeto
112 , es posible elaborar y precisar una unidad de
113 pruebas de aplicaciones
114 <acronym>MVC</acronym>
119 <sect2 id="zend.controller.request.http">
120 <title>Solicitud HTTP</title>
122 <sect3 id="zend.controller.request.http.dataacess">
123 <title>Solicitud de acceso a datos</title>
126 <classname>Zend_Controller_Request_Http</classname>
128 acceso a relevantes valores tal como el nombre de la llave y el
130 para el controlador y variables de aación enrutamiento y
132 adicionales analizados desde el
133 <acronym>URI</acronym>
134 . Adiccionalmente permite el acceso a
135 valores contenidos en las superglobales como
137 administra la actual base
138 <acronym>URL</acronym>
140 <acronym>URI</acronym>
141 . los valores Superglobales no pueden
142 ser determinados en una solicitud objeto, en
145 <methodname>setParam()</methodname>
147 <methodname>getParam()</methodname>
149 recuperar los parámetros del usuario.
153 <title>Datos Superglobales</title>
155 Cuando se accede a datos Superglobales a través
156 <classname>Zend_Controller_Request_Http</classname>
158 propiedades de miembros públicos, es necesario mantener en
160 nombre de la propiedad (supergloabl array key)
161 corresponda a una supergloabl en
162 un específico orden de
164 <constant>GET</constant>
166 <constant>POST</constant>
168 <constant>COOKIE</constant>
170 <constant>SERVER</constant>
172 <constant>ENV</constant>
178 Las supergloables específicas pueden ser accedidas usando un
179 método público como una
180 alternativa. Por ejemplo, el valor
182 <varname>$_POST['user']</varname>
185 <methodname>getPost('user')</methodname>
187 solicitud objeto. Esto incluye
188 <methodname>getQuery()</methodname>
189 para recuperar elementos
190 <varname>$_GET</varname>
192 <methodname>getHeader()</methodname>
194 solicitud de los encabezadores (headers).
198 <title>Datos GET y POST</title>
199 <para>Sea cauteloso cuando accede a los datos de la solicitud
201 filtrado en ninguna manera. El router y
202 dispatcher valida y filtra datos para
204 pero dejan los datos intactos en la solicitud objeto.
209 <title>Recuperando los datos POST sin procesar</title>
212 Como 1.5.0, se puede recuperar los datos sin procesar a
214 <methodname>getRawBody()</methodname>
216 Este método retorna falso si los datos han sido enviados de
218 no retorna el cuerpo entero del post.
222 Esto es primordialmente útil para aceptar el contenido
223 cuando se desarrolla una
225 <acronym>MVC</acronym>
231 Usted puede determinar parámetros de usuario en la solicitud
233 <methodname>setParam()</methodname>
235 los mismos despues usando
236 <methodname>getParam()</methodname>
238 El router hace uso de esta funcionalidad para determinar
239 parámetros correspondientes
241 <acronym>URI</acronym>
242 a la solicitud objeto.
246 <title>getParam() Recupera mas que Parámetros de Usuario</title>
249 En orden para hacer el mismo trabajo,
250 <methodname>getParam()</methodname>
252 desde muchas fuentes. En orden de prioridad, estas incluyen:
253 parámetros de usuario determinados a través de
254 <methodname>setParam()</methodname>
256 <constant>GET</constant>
257 , y finalmente parámetros
258 <constant>POST</constant>
259 . Ser conciente de esto cuando
260 se sacan datos a través de este método.
264 Si se desea sacar solo desde parámetros se configura a
266 <methodname>setParam()</methodname>
268 <methodname>getUserParam()</methodname>
273 Además, a partir de 1.5.0, puede bloquear el parámetro
274 que se buscará en las
276 <methodname>setParamSources()</methodname>
278 especificar un array vacío o un array con uno o más de los
280 '_GET' o '_POST', indicando que fuente de parámetro
281 se permite (por defecto,
282 ambos son permitidos); si se desea
283 restringir el acceso a solamente '_GET'
285 <methodname>setParamSources
286 (array('_GET'))</methodname>
292 <title>Apache Quirks</title>
294 Si está usando Apache 404 handler para pasar If you are
296 handler to pass incoming requests to the
297 front controller, or using a PT flag
299 <varname>$_SERVER['REDIRECT_URL']</varname>
301 <acronym>URI</acronym>
303 <varname>$_SERVER['REQUEST_URI']</varname>
305 using such a setup and getting invalid routing, you should
307 <classname>Zend_Controller_Request_Apache404</classname>
308 class instead of the default
309 <acronym>HTTP</acronym>
310 class for your request
314 <programlisting language="php"><![CDATA[
315 $request = new Zend_Controller_Request_Apache404();
316 $front->setRequest($request);
320 This class extends the
321 <classname>Zend_Controller_Request_Http</classname>
322 class and simply modifies the autodiscovery of the request
323 URI. It can be used as
324 a drop-in replacement.
329 <sect3 id="zend.controller.request.http.baseurl">
330 <title>Base Url and Subdirectories</title>
333 <classname>Zend_Controller_Request_Http</classname>
335 <classname>Zend_Controller_Router_Rewrite</classname>
337 used in subdirectories.
338 <classname>Zend_Controller_Request_Http</classname>
340 attempt to automatically detect your base
341 <acronym>URL</acronym>
342 and set it accordingly.
346 For example, if you keep your
347 <filename>index.php</filename>
348 in a webserver subdirectory named
349 <filename>/projects/myapp/index.php</filename>
351 <acronym>URL</acronym>
352 (rewrite base) should be set to
353 <filename>/projects/myapp</filename>
355 then be stripped from the beginning of the path before
357 any route matches. This frees one from the necessity
358 of prepending it to any of your
360 <command>'user/:username'</command>
362 <acronym>URI</acronym>
364 <filename>http://localhost/projects/myapp/user/martel</filename>
366 <filename>http://example.com/user/martel</filename>
371 <title>URL Detection is Case Sensitive</title>
374 <acronym>URL</acronym>
376 sensitive, so make sure your
377 <acronym>URL</acronym>
379 match a subdirectory name in a filesystem (even on Windows
381 doesn't, an exception will be raised.
387 <acronym>URL</acronym>
388 be detected incorrectly
389 you can override it with your own base path with the help of
391 <methodname>setBaseUrl()</methodname>
393 <classname>Zend_Controller_Request_Http</classname>
396 <classname>Zend_Controller_Front</classname>
398 easiest method is to set it in
399 <classname>Zend_Controller_Front</classname>
401 proxy it into the request object. Example usage to set a custom
403 <acronym>URL</acronym>
407 <programlisting language="php"><![CDATA[
409 * Dispatch Request with custom base URL with Zend_Controller_Front.
411 $router = new Zend_Controller_Router_Rewrite();
412 $controller = Zend_Controller_Front::getInstance();
413 $controller->setControllerDirectory('./application/controllers')
415 ->setBaseUrl('/projects/myapp'); // set the base url!
416 $response = $controller->dispatch();
421 <sect3 id="zend.controller.request.http.method">
422 <title>Determining the Request Method</title>
425 <methodname>getMethod()</methodname>
426 allows you to determine the
427 <acronym>HTTP</acronym>
428 request method used to request the
429 current resource. Additionally, a variety of
431 allow you to get boolean responses when asking if a specific
433 of request has been made:
439 <methodname>isGet()</methodname>
444 <methodname>isPost()</methodname>
449 <methodname>isPut()</methodname>
454 <methodname>isDelete()</methodname>
459 <methodname>isHead()</methodname>
464 <methodname>isOptions()</methodname>
470 The primary use case for these is for creating RESTful
471 <acronym>MVC</acronym>
476 <sect3 id="zend.controller.request.http.ajax">
477 <title>Detecting AJAX Requests</title>
480 <classname>Zend_Controller_Request_Http</classname>
482 rudimentary method for detecting
483 <acronym>AJAX</acronym>
485 <methodname>isXmlHttpRequest()</methodname>
488 <acronym>HTTP</acronym>
490 <emphasis>X-Requested-With</emphasis>
492 'XMLHttpRequest'; if found, it returns
493 <constant>TRUE</constant>
497 <para>Currently, this header is known to be passed by default with
503 <para>Prototype/Scriptaculous (and libraries derived from
507 <para>Yahoo! UI Library</para>
513 <para>MochiKit</para>
519 <acronym>AJAX</acronym>
520 libraries allow you to send
522 <acronym>HTTP</acronym>
523 request headers; if your library does not send this
524 header, simply add it as a
525 request header to ensure the
526 <methodname>isXmlHttpRequest()</methodname>
533 <sect2 id="zend.controller.request.subclassing">
534 <title>Subclassing the Request Object</title>
537 The base request class used for all request objects is the
539 <classname>Zend_Controller_Request_Abstract</classname>
541 most basic, it defines the following methods:
544 <programlisting language="php"><![CDATA[
545 abstract class Zend_Controller_Request_Abstract
550 public function getControllerName();
553 * @param string $value
556 public function setControllerName($value);
561 public function getActionName();
564 * @param string $value
567 public function setActionName($value);
572 public function getControllerKey();
578 public function setControllerKey($key);
583 public function getActionKey();
589 public function setActionKey($key);
595 public function getParam($key);
599 * @param mixed $value
602 public function setParam($key, $value);
607 public function getParams();
610 * @param array $array
613 public function setParams(array $array);
616 * @param boolean $flag
619 public function setDispatched($flag = true);
624 public function isDispatched();
628 <para>La solicitud objeto es un contenedor para entorno de la
629 solicitud. La cadena del
630 controlador sólo necesita saber cómo
631 establecer y recuperar el controlador, la acción,
633 opcionales, y el estado del despachador. Por defecto, la solicitud
635 sus propios parámetros mediante el controlador o las llaves
636 de la acción con el fin de
637 determinar el controlador y la acción.</para>
640 Para ampliar esta clase, o uno de sus derivados, cuando se
641 necesita la clase solicitud
642 que interactue con un entorno específico
643 con el fin de recuperar los datos para su uso en
645 descritas. Los ejemplos incluyen
646 <link linkend="zend.controller.request.http">
648 <acronym>HTTP</acronym>
651 <acronym>CLI</acronym>
653 <acronym>PHP</acronym>