Conceptos Básicos de Zend_Controller
El sistema
Zend_Controller
está diseñado para
ser liviano, modular y extensible. Se trata de un diseño minimalista
para
permitir flexibilidad y cierta libertad para los usuarios
proporcionando al mismo tiempo una
estructura suficiente para que sistemas
construidos alrededor de
Zend_Controller
compartan algunas convenciones y layouts de código similares.
El siguiente diagrama muestra el flujo de trabajo, y la narrativa
que le sigue describe en
detalle las interacciones:
El flujo de procesos de
Zend_Controller
está implementado
por varios componentes. Si bien no es necesario entender los cimientos
de
todos estos componentes para utilizar el sistema, tener un
conocimiento práctico del proceso
es de mucha utilidad.
Zend_Controller_Front
organiza todo
el flujo de trabajo del sistema
Zend_Controller
.
Es una interpretación del patrón FrontController.
Zend_Controller_Front
procesa todas
las solicitudes recibidas por el servidor y es responsable
en última instancia de la delegación de las solicitudes a los
ActionControllers
(
Zend_Controller_Action
).
Zend_Controller_Request_Abstract
(a
menudo denominado
Request Object
) representa
el entorno de la solicitud y ofrece métodos para
establecer y recuperar el controlador, los nombres de las
acciones y cualquier parámetro de solicitud. Además realiza un seguimiento
de si la acción que contiene ha sido enviada o no
por
Zend_Controller_Dispatcher
.
Se pueden usar extensiones del objeto abstracto para
encapsular toda el entorno de la solicitud,
permitiendo a los routers traer información del ámbito
de la solicitud a fin de establecer el controlador
y los nombres de acción.
Por defecto, se usa
Zend_Controller_Request_Http
, el cual
proporciona acceso a todo el ámbito de la petición
HTTP
.
Zend_Controller_Router_Interface
se usa para definir routers. El ruteo es el proceso de
examinar el ámbito de la solicitud para determinar
qué controlador, y qué acción del controlador debe recibir
la solicitud. Este controlador, la acción, y los parámetros
opcionales son luego establecidos en el objeto de la solicitud
para ser procesados por
Zend_Controller_Dispatcher_Standard
.
El ruteo (routing) ocurre sólo una vez: cuando la solicitud
se recibe inicialmente y antes de enviar el primer
controlador.
El router por defecto,
Zend_Controller_Router_Rewrite
,
toma el punto final de una
URI
como se especificó en
Zend_Controller_Request_Http
y la descompone en un controlador, una acción y parámetros,
basándose en la información de la ruta del url.
Como ejemplo, la
URL
http://localhost/foo/bar/key/value
se
decodificará para usar el controlador
foo
,
la acción
bar
y especificar un parámetro
key
con el valor de
value
.
Zend_Controller_Router_Rewrite
también puede ser utilizado para igualar las rutas arbitrarios;
para más información, ver
documentación
del router
.
Zend_Controller_Dispatcher_Interface
se usa para definir dispatchers. Dispatching (Despachar) es el proceso
de sacar el controlador y la acción del objeto que solicita y
mapearlo a un controlador archivo (o clase) y al método acción
en la clase del controlador. Si el controlador o acción no
existen, hará un manejo para determinar los controladores
por defecto y las acciones a enviar.
El proceso actual de dispatching(despacho) consta de instanciar la
clase del controlador y llamar al método acción en esa
clase. A diferencia del routing, que ocurre sólo una vez,
el dispatching(despacho) ocurre en un bucle. Si el estado del objeto que
que envía la solicita es reseteado en cualquier punto,
el bucle se repetirá, llamando a cualquier acción que esté
actualmente establecida en la solicitud del objeto.
La primera vez el bucle termina con la solicitud del objeto,
el estado de lo enviado se establece a (
BooleanTRUE
),
que terminará el procesamiento.
El dispatcher por defecto es
Zend_Controller_Dispatcher_Standard
.
Se definen como controladores MixedCasedClasses cuando
terminan en la palabra Controller, y los métodos de acción
como camelCasedMethods cuando terminan en la palabra Action:
FooController::barAction()
. En este caso,
el controlador será referido como
foo
y a la
acción como
bar
.
Convenciones para Case Naming (Casos de Nombre)
Dado que los humanos somos notablemente inconsistentes
en mantener cierta sensibilidad respecto a las
minúsculas y mayúsculas al escribir enlaces,
Zend Framework realmente normaliza la información de la
ruta a minúsculas. Esto, por supuesto, afectará cómo
nombre a su controlador y a sus acciones... o referirse
a ellos en los enlaces.
Si desea que su clase controlador o el nombre del
método de la acción tenga múltiples MixedCasedWords o
camelCasedWords, para separar las palabras en la
URL
necesitará hacerlo con un '-' o '.' (aunque puede
configurar el carácter utilizado).
Como ejemplo, si se va a la acción en
FooBarController::bazBatAction()
,
se referirá a ella en la
URL
como
/foo-bar/baz-bat
o
/foo.bar/baz.bat
.
Zend_Controller_Action
es el componente base del controlador de acción.
Cada controlador es una sola clase que extiende la
clase Zend_Controller_Action
y debe contener uno o más métodos de acción.
Zend_Controller_Response_Abstract
define una clase base de respuesta utilizada para recoger y
retornar respuestas de los controladores de acción.
Recoge tanto a las cabeceras como al contenido del cuerpo.
La clase de respuesta (response) por defecto es
Zend_Controller_Response_Http
,
la cual es adecuada para usarla en un entorno
HTTP
.
El flujo de procesos de
Zend_Controller
es relativamente
sencillo. Una solicitud es recibida por
Zend_Controller_Front
, la que a su vez llama a
Zend_Controller_Router_Rewrite
para determinar qué controlador (y la acción en ese controlador)
despachar.
Zend_Controller_Router_Rewrite
descompone la
URI
a fin de establecer el controlador y el nombre de
acción en la solicitud.
Zend_Controller_Front
entonces entra al bucle del dispatch. Llama a
Zend_Controller_Dispatcher_Standard
,
el que pasa la solicitud para enviar al controlador y a la acción
especificada en la
solicitud (o el usado por defecto).
Después de que el controlador ha terminado, el control
vuelve a
Zend_Controller_Front
.
Si el controlador ha indicado que debe enviarse otro controlador
mediante el reinicio del
estado de la condición de la solicitud,
el bucle continúa y se ejecuta otro envio.
En caso
contrario el proceso termina.