El objeto request es un objeto de valor simple que es pasado
entre
Zend_Controller_Front
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.
-
El nombre del módulo es accedido por
getModuleName()
ysetModuleName()
. -
El nombre del controlador es accedido por
getControllerName()
ysetControllerName()
. -
El nombre de la acción que llamar dentro del controlador es accedido por
getActionName()
ysetActionName()
. -
Los parámetros accesibles por la acción son un array asociativo de pares clave/valor que son recuperados por
getParams()
y configurados consetParams()
, o configurados individualmente porgetParam()
ysetParam()
.
Basado en el tipo de solicitud, puede haber más métodos
disponibles. La solicitud por
defecto usada,
Zend_Controller_Request_Http
, por
ejemplo, tiene métodos para recuperar la
URI
de
la solicitud, ruta de la información, parámetros
$_GET
y
$_POST
, etc.
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.
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 objeto respuesta , es posible elaborar y precisar una unidad de pruebas de aplicaciones MVC .
Zend_Controller_Request_Http
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()
y
getParam()
para determinar o
recuperar los parámetros del usuario.
Datos Superglobales
Cuando se accede a datos Superglobales a través
Zend_Controller_Request_Http
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
.
Las supergloables específicas pueden ser accedidas usando un
método público como una
alternativa. Por ejemplo, el valor
original de
$_POST['user']
puede ser accedido
llamando a
getPost('user')
en la
solicitud objeto. Esto incluye
getQuery()
para recuperar elementos
$_GET
, y
getHeader()
para recuperar la
solicitud de los encabezadores (headers).
Datos GET y POST
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.
Recuperando los datos POST sin procesar
Como 1.5.0, se puede recuperar los datos sin procesar a
través del método
getRawBody()
.
Este método retorna falso si los datos han sido enviados de
esa manera, pero si
no retorna el cuerpo entero del post.
Esto es primordialmente útil para aceptar el contenido cuando se desarrolla una aplicación MVC simple.
Usted puede determinar parámetros de usuario en la solicitud
objeto usando
setParam()
y recuperar
los mismos despues usando
getParam()
.
El router hace uso de esta funcionalidad para determinar
parámetros correspondientes
en la solicitud
URI
a la solicitud objeto.
getParam() Recupera mas que Parámetros de Usuario
En orden para hacer el mismo trabajo,
getParam()
recupera actualmente
desde muchas fuentes. En orden de prioridad, estas incluyen:
parámetros de usuario determinados a través de
setParam()
, parámetros
GET
, y finalmente parámetros
POST
. Ser conciente de esto cuando
se sacan datos a través de este método.
Si se desea sacar solo desde parámetros se configura a
través de
setParam()
, use
getUserParam()
.
Además, a partir de 1.5.0, puede bloquear el parámetro
que se buscará en las
fuentes.
setParamSources()
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
setParamSources
(array('_GET'))
.
Apache Quirks
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,
$_SERVER['REDIRECT_URL']
contains the
URI
you need, not
$_SERVER['REQUEST_URI']
. If you are
using such a setup and getting invalid routing, you should
use the
Zend_Controller_Request_Apache404
class instead of the default
HTTP
class for your request
object:
$request = new Zend_Controller_Request_Apache404(); $front->setRequest($request);
This class extends the
Zend_Controller_Request_Http
class and simply modifies the autodiscovery of the request
URI. It can be used as
a drop-in replacement.
Zend_Controller_Request_Http
allows
Zend_Controller_Router_Rewrite
to be
used in subdirectories.
Zend_Controller_Request_Http
will
attempt to automatically detect your base
URL
and set it accordingly.
For example, if you keep your
index.php
in a webserver subdirectory named
/projects/myapp/index.php
, base
URL
(rewrite base) should be set to
/projects/myapp
. 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
'user/:username'
will match
URI
s like
http://localhost/projects/myapp/user/martel
and
http://example.com/user/martel
.
URL Detection is Case Sensitive
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.
Should base
URL
be detected incorrectly
you can override it with your own base path with the help of
the
setBaseUrl()
method of either the
Zend_Controller_Request_Http
class,
or the
Zend_Controller_Front
class. The
easiest method is to set it in
Zend_Controller_Front
, which will
proxy it into the request object. Example usage to set a custom
base
URL
:
/** * 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();
getMethod()
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:
-
isGet()
-
isPost()
-
isPut()
-
isDelete()
-
isHead()
-
isOptions()
The primary use case for these is for creating RESTful MVC architectures.
Zend_Controller_Request_Http
has a
rudimentary method for detecting
AJAX
requests:
isXmlHttpRequest()
. This
method looks for an
HTTP
request header
X-Requested-With
with the value
'XMLHttpRequest'; if found, it returns
TRUE
.
Currently, this header is known to be passed by default with the following JS libraries:
-
Prototype/Scriptaculous (and libraries derived from Prototype)
-
Yahoo! UI Library
-
jQuery
-
MochiKit
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
isXmlHttpRequest()
method works for
you.
The base request class used for all request objects is the
abstract class
Zend_Controller_Request_Abstract
. At its
most basic, it defines the following methods:
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(); }
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 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 el entorno HTTP , un entorno CLI , o un entorno de PHP -GTK.