| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426 |
- <?xml version="1.0" encoding="UTF-8"?>
- <!-- EN-Revision: 15103 -->
- <!-- Reviewed: no -->
- <sect1 id="zend.controller.request">
- <title>La solicitud del Objeto</title>
- <sect2 id="zend.controller.request.introduction">
- <title>Introducción</title>
- <para>
- El objeto request es un objeto de valor simple que es pasado entre
- <classname>Zend_Controller_Front</classname> y el router, dispatcher, y
- clases de controlador. Empaqueta los nombres del módulo solicitado,
- controlador, acción, y los parámetros opcionales, así como el resto del
- entorno de la solicitud, ya sea HTTP, el CLI, o PHP-GTK.
- </para>
- <itemizedlist>
- <listitem><para>
- El nombre del módulo es accedido por
- <methodname>getModuleName()</methodname> y
- <methodname>setModuleName()</methodname>.
- </para></listitem>
- <listitem><para>
- El nombre del controlador es accedido por
- <methodname>getControllerName()</methodname> y
- <methodname>setControllerName()</methodname>.
- </para></listitem>
- <listitem><para>
- El nombre de la acción que llamar dentro del controlador es
- accedido por <methodname>getActionName()</methodname> y
- <methodname>setActionName()</methodname>.
- </para></listitem>
- <listitem><para>
- Los parámetros accesibles por la acción son un array asociativo de pares clave/valor que son recuperados por <methodname>getParams()</methodname>
- y configurados con <methodname>setParams()</methodname>, o configurados individualmente por
- <methodname>getParam()</methodname> y <methodname>setParam()</methodname>.
- </para></listitem>
- </itemizedlist>
- <para>
- Basado en el tipo de solicitud, puede haber más métodos disponibles.
- La solicitud por defecto usada, <classname>Zend_Controller_Request_Http</classname>,
- por ejemplo, tiene métodos para recuperar la URI de la solicitud, ruta de la
- información, parámetros <methodname>$_GET</methodname> y <methodname>$_POST</methodname>,
- etc.
- </para>
- <para>
- El objeto request es pasado al controlador front, o si no es
- provisto, es instanciado al principio del proceso dispatcher,
- antes de que ocurra el enrutamiento. Es pasado a través de todos los objetos
- en la cadena del dispatcher.
- </para>
- <para>
- Adicionalmente, la solicitud objeto es particularmente útil en pruebas.
- El desarrolador puede cambiar el entorno de la solicitud, incluyendo módulos,
- controladores, acciones, parámetros, URI, etc, y pasar la solicitud
- objeto al controlador front para probar el flujo de la aplicación. Cuando se vincula
- con el <link linkend="zend.controller.response">objeto
- respuesta </link>, es posible elaborar y precisar una unidad de pruebas de aplicaciones
- MVC.
- </para>
- </sect2>
- <sect2 id="zend.controller.request.http">
- <title>Solicitud HTTP</title>
- <sect3 id="zend.controller.request.http.dataacess">
- <title>Solicitud de acceso a datos</title>
- <para>
- <classname>Zend_Controller_Request_Http</classname> encapsula el acceso a
- relevantes valores tal como el nombre de la llave y el valor para el
- controlador y variables de aación enrutamiento y todos los
- parámetros adicionales analizados desde el URI. Adiccionalmente permite el acceso
- a valores contenidos en las superglobales como miembros públicos y
- administra la actual base URL y la solicitud URI. los valores
- Superglobales no pueden ser determinados en una solicitud objeto, en vez usar los
- métodos setParam/getParam para determinar o recuperar los parámetros del usuario.
- </para>
- <note>
- <title>Datos Superglobales</title>
- <para>
- Cuando se accede a datos Superglobales a través
- <classname>Zend_Controller_Request_Http</classname> como propiedades de miembros
- públicos, es necesario mantener en mente que el nombre de la
- propiedad (supergloabl array key) corresponda a una
- supergloabl en un específico orden de precedencia:1. GET, 2.
- POST, 3. COOKIE, 4. SERVER, 5. ENV.
- </para>
- </note>
- <para>
- Las supergloables específicas pueden ser accedidas usando un método público como
- una alternativa. Por ejemplo, el valor original de
- <methodname>$_POST['user']</methodname> puede ser accedido llamando a
- <methodname>getPost('user')</methodname> en la solicitud objeto. Esto
- incluye <methodname>getQuery()</methodname> para recuperar elementos
- <methodname>$_GET</methodname>, y <methodname>getHeader()</methodname> para
- recuperar la solicitud de los encabezadores (headers).
- </para>
- <note>
- <title>Datos GET y POST</title>
- <para>
- Sea cauteloso cuando accede a los datos de la solicitud objeto como
- no es filtrado en ninguna manera. El router y dispatcher
- valida y filtra datos para usar con sus tareas, pero dejan
- los datos intactos en la solicitud objeto.
- </para>
- </note>
- <note>
- <title>Recuperando los datos POST sin procesar</title>
- <para>
- Como 1.5.0, se puede recuperar los datos sin procesar a través del
- método <methodname>getRawBody()</methodname>. Este método retorna falso
- si los datos han sido enviados de esa manera, pero si no retorna el cuerpo
- entero del post.
- </para>
- <para>
- Esto es primordialmente útil para aceptar el contenido cuando
- se desarrolla una aplicación MVC simple.
- </para>
- </note>
- <para>
- Usted puede determinar parámetros de usuario en la solicitud objeto usando
- <methodname>setParam()</methodname> y recuperar los mismos despues usando
- <methodname>getParam()</methodname>. El router hace uso de esta
- funcionalidad para determinar parámetros correspondientes en la solicitud URI
- a la solicitud objeto.
- </para>
- <note>
- <title>getParam() Recupera mas que Parámetros de Usuario</title>
- <para>
- En orden para hacer el mismo trabajo, <methodname>getParam()</methodname> recupera
- actualmente desde muchas fuentes. En orden de prioridad, estas
- incluyen: parámetros de usuario determinados a través de <methodname>setParam()</methodname>,
- parámetros <methodname>GET</methodname>, y finalmente parámetros <methodname>POST</methodname>.
- Ser conciente de esto cuando se sacan datos a través de este
- método.
- </para>
- <para>
- Si se desea sacar solo desde parámetros se configura a través de
- <methodname>setParam()</methodname>, use <methodname>getUserParam()</methodname>.
- </para>
- <para>
- Además, a partir de 1.5.0, puede bloquear el parámetro que
- se buscará en las fuentes. <methodname>setParamSources()</methodname>
- le permite especificar un array vacío o un array con uno o
- más de los valores '_GET' o '_POST', indicando que
- fuente de parámetro se permite (por defecto, ambos son
- permitidos); si se desea restringir el acceso a solamente '_GET'
- especificar <methodname>setParamSources (array('_GET'))</methodname>.
- </para>
- </note>
- <note>
- <title>Apache Quirks</title>
- <para>
- Si está usando Apache 404 handler para pasar
- If you are using Apache's 404 handler to pass incoming
- requests to the front controller, or using a PT flag with
- rewrite rules, <methodname>$_SERVER['REDIRECT_URL']</methodname>
- contains the URI you need, not
- <methodname>$_SERVER['REQUEST_URI']</methodname>. If you are using such
- a setup and getting invalid routing, you should use the
- <classname>Zend_Controller_Request_Apache404</classname> class instead
- of the default Http class for your request object:
- </para>
- <programlisting language="php"><![CDATA[
- $request = new Zend_Controller_Request_Apache404();
- $front->setRequest($request);
- ]]></programlisting>
- <para>
- This class extends the
- <classname>Zend_Controller_Request_Http</classname> class and simply
- modifies the autodiscovery of the request URI. It can be
- used as a drop-in replacement.
- </para>
- </note>
- </sect3>
- <sect3 id="zend.controller.request.http.baseurl">
- <title>Base Url and Subdirectories</title>
- <para>
- <classname>Zend_Controller_Request_Http</classname> allows
- <classname>Zend_Controller_Router_Rewrite</classname> to be used in subdirectories.
- <classname>Zend_Controller_Request_Http</classname> will attempt to automatically
- detect your base URL and set it accordingly.
- </para>
- <para>
- For example, if you keep your <methodname>index.php</methodname> in a
- webserver subdirectory named
- <methodname>/projects/myapp/index.php</methodname>, base URL (rewrite base)
- should be set to <methodname>/projects/myapp</methodname>. This string will
- then be stripped from the beginning of the path before
- calculating any route matches. This frees one from the necessity
- of prepending it to any of your routes. A route of
- <methodname>'user/:username'</methodname> will match URIs like
- <methodname>http://localhost/projects/myapp/user/martel</methodname> and
- <methodname>http://example.com/user/martel</methodname>.
- </para>
- <note>
- <title>URL Detection is Case Sensitive</title>
- <para>
- Automatic base URL detection is case sensitive, so make sure your URL
- will match a subdirectory name in a filesystem (even on Windows
- machines). If it doesn't, an exception will be raised.
- </para>
- </note>
- <para>
- Should base URL be detected incorrectly you can override it
- with your own base path with the help of the
- <methodname>setBaseUrl()</methodname> method of either the
- <classname>Zend_Controller_Request_Http</classname> class, or the
- <classname>Zend_Controller_Front</classname> class. The easiest
- method is to set it in <classname>Zend_Controller_Front</classname>,
- which will proxy it into the request object. Example usage to
- set a custom base URL:
- </para>
- <programlisting language="php"><![CDATA[
- /**
- * Dispatch Request with custom base URL with Zend_Controller_Front.
- */
- $router = new Zend_Controller_Router_Rewrite();
- $controller = Zend_Controller_Front::getInstance();
- $controller->setControllerDirectory('./application/controllers')
- ->setRouter($router)
- ->setBaseUrl('/projects/myapp'); // set the base url!
- $response = $controller->dispatch();
- ]]></programlisting>
- </sect3>
- <sect3 id="zend.controller.request.http.method">
- <title>Determining the Request Method</title>
- <para>
- <methodname>getMethod()</methodname> allows you to determine the HTTP
- request method used to request the current resource.
- Additionally, a variety of methods exist that allow you to get
- boolean responses when asking if a specific type of request has
- been made:
- </para>
- <itemizedlist>
- <listitem><para><methodname>isGet()</methodname></para></listitem>
- <listitem><para><methodname>isPost()</methodname></para></listitem>
- <listitem><para><methodname>isPut()</methodname></para></listitem>
- <listitem><para><methodname>isDelete()</methodname></para></listitem>
- <listitem><para><methodname>isHead()</methodname></para></listitem>
- <listitem><para><methodname>isOptions()</methodname></para></listitem>
- </itemizedlist>
- <para>
- The primary use case for these is for creating RESTful MVC
- architectures.
- </para>
- </sect3>
- <sect3 id="zend.controller.request.http.ajax">
- <title>Detecting AJAX Requests</title>
- <para>
- <classname>Zend_Controller_Request_Http</classname> has a rudimentary
- method for detecting AJAX requests:
- <methodname>isXmlHttpRequest()</methodname>. This method looks for an
- HTTP request header <methodname>X-Requested-With</methodname> with the value
- 'XMLHttpRequest'; if found, it returns true.
- </para>
- <para>
- Currently, this header is known to be passed by default with the
- following JS libraries:
- </para>
- <itemizedlist>
- <listitem><para>Prototype/Scriptaculous (and libraries derived
- from Prototype)</para></listitem>
- <listitem><para>Yahoo! UI Library</para></listitem>
- <listitem><para>jQuery</para></listitem>
- <listitem><para>MochiKit</para></listitem>
- </itemizedlist>
- <para>
- Most AJAX libraries allow you to send custom HTTP request
- headers; if your library does not send this header, simply add
- it as a request header to ensure the
- <methodname>isXmlHttpRequest()</methodname> method works for you.
- </para>
- </sect3>
- </sect2>
- <sect2 id="zend.controller.request.subclassing">
- <title>Subclassing the Request Object</title>
- <para>
- The base request class used for all request objects is the abstract
- class <classname>Zend_Controller_Request_Abstract</classname>. At its most
- basic, it defines the following methods:
- </para>
- <programlisting language="php"><![CDATA[
- abstract class Zend_Controller_Request_Abstract
- {
- /**
- * @return string
- */
- public function getControllerName();
- /**
- * @param string $value
- * @return self
- */
- public function setControllerName($value);
- /**
- * @return string
- */
- public function getActionName();
- /**
- * @param string $value
- * @return self
- */
- public function setActionName($value);
- /**
- * @return string
- */
- public function getControllerKey();
- /**
- * @param string $key
- * @return self
- */
- public function setControllerKey($key);
- /**
- * @return string
- */
- public function getActionKey();
- /**
- * @param string $key
- * @return self
- */
- public function setActionKey($key);
- /**
- * @param string $key
- * @return mixed
- */
- public function getParam($key);
- /**
- * @param string $key
- * @param mixed $value
- * @return self
- */
- public function setParam($key, $value);
- /**
- * @return array
- */
- public function getParams();
- /**
- * @param array $array
- * @return self
- */
- public function setParams(array $array);
- /**
- * @param boolean $flag
- * @return self
- */
- public function setDispatched($flag = true);
- /**
- * @return boolean
- */
- public function isDispatched();
- }
- ]]></programlisting>
- <para>
- La solicitud objeto es un contenedor para entorno de la solicitud. La
- cadena del controlador sólo necesita saber cómo establecer y recuperar el
- controlador, la acción, los parámetros opcionales, y el estado del despachador. Por
- defecto, la solicitud buscará sus propios parámetros mediante el
- controlador o las llaves de la acción con el fin de determinar el controlador y
- la acción.
- </para>
- <para>
- Para ampliar esta clase, o uno de sus derivados, cuando se necesita la
- clase solicitud que interactue con un entorno específico con el fin de
- recuperar los datos para su uso en las tareas antes descritas. Los ejemplos incluyen <link
- linkend = "zend.controller.request.http"> el entorno HTTP
- </link>, un entorno CLI, o un entorno de PHP-GTK.
- </para>
- </sect2>
- </sect1>
- <!--
- vim:se ts=4 sw=4 et:
- -->
|