| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226 |
- <?xml version="1.0" encoding="UTF-8"?>
- <!-- Reviewed: no -->
- <sect1 id="zend.controller.basics">
- <title>Conceptos Básicos de Zend_Controller</title>
- <para>
- El sistema <classname>Zend_Controller</classname> 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 suficiente estructura para que sistemas
- construidos alrededor de <classname>Zend_Controller</classname>
- compartan algunas convenciones y layouts de código similares.
- </para>
- <para>
- El siguiente diagrama muestra el flujo de trabajo, y la narrativa
- que le sigue describe en detalle las interacciones:
- </para>
- <para>
- <inlinegraphic width="483" scale="100" align="center" valign="middle"
- fileref="figures/zend.controller.basics.png" format="PNG" />
- </para>
- <para>
- El workflow de <classname>Zend_Controller</classname> 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.
- </para>
- <itemizedlist>
- <listitem>
- <para>
- <classname>Zend_Controller_Front</classname> orquesta todo
- el workflow del sistema <classname>Zend_Controller</classname>.
- Es una interpretación del patrón FrontController.
- <classname>Zend_Controller_Front</classname> procesa todas
- las solicitudes recibidas por el servidor y es responsable
- en última instancia para delegar requerimientos a los
- ActionControllers
- (<classname>Zend_Controller_Action</classname>).
- </para>
- </listitem>
- <listitem>
- <para>
- <classname>Zend_Controller_Request_Abstract</classname> (a
- menudo denominado <code>Request Object</code>) representa
- el medio ambiente de la solicitud y ofrece métodos para
- establecer y recuperar el controlador, los nombres de
- acción y cualquier parámetro de solicitd. Además mantiene
- la pista de si la acción que contiene ha sido enviada o no
- por <classname>Zend_Controller_Dispatcher</classname>.
- Se pueden uar extensiones del objeto abstracto para
- encapsular toda el medio ambiente de la solicitud,
- permitiendo a los routers traer información del medio
- ambiente de la solicitud a fin de establecer el controlador
- y los nombres de acción.
- </para>
- <para>
- Por defecto, se usa
- <classname>Zend_Controller_Request_Http</classname>, que
- proporciona acceso a todo el medio ambiente de la petición
- HTTP.
- </para>
- </listitem>
- <listitem>
- <para>
- <classname>Zend_Controller_Router_Interface</classname>
- se usa para definir routers. El ruteo es el proceso de
- examinar el medio ambiente de la solicitud para determinar
- qué controlador, y qué acción del contralor debe recibir
- la solicitud. Este controlador, la acción, y los parámetros
- opcionales son luego establecidos en el objeto solicitud
- para ser procesados por
- <classname>Zend_Controller_Dispatcher_Standard</classname>.
- El ruteo (routing) ocurre sólo una vez: cuando la solicitud
- se recibie inicialmente y antes de despachar el primer
- controlador.
- </para>
- <para>
- El router por defecto,
- <classname>Zend_Controller_Router_Rewrite</classname>,
- toma el punto final de una URI como se especidicó en
- <classname>Zend_Controller_Request_Http</classname>
- y la descompone en un controlador, acción y parámetros
- basados en la información del path en la url.
- Como ejemplo, la URL
- <code>http://localhost/foo/bar/key/value</code> se
- decodificará para usar el controlador <code>foo</code>,
- la acción <code>bar</code> y especificar un parámetro
- <code>key</code> con el valor de <code>value</code>.
- </para>
- <para>
- <classname>Zend_Controller_Router_Rewrite</classname>
- también puede ser utilizado para igualar paths arbitrarios;
- para más información, ver <link
- linkend="zend.controller.router">documentación
- del router</link>.
- </para>
- </listitem>
- <listitem>
- <para>
- <classname>Zend_Controller_Dispatcher_Interface</classname>
- se usa para definir despachadores. Despachar es el proceso
- de sacar el controlador y la acción del objeto solicitud y
- mapearlo a un controlador archivo/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 despachar.
- </para>
- <para>
- El proceso actual de 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 despacho ocurre en un bucle. Si el status del objeto
- solicitud despachado es reseteado en cualquier punto,
- el bucle se repetirá, llamando a cualquier acción que esté
- actualmente establecida en el objeto solicitud.
- La primera vez el bucle termina con el objeto solicitud,
- el status de lo despachado se establece a (booleano true),
- que terminará el procesamiento.
- </para>
- <para>
- El despachador por defecto es
- <classname>Zend_Controller_Dispatcher_Standard</classname>.
- 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:
- <code>FooController::barAction()</code>. En este caso,
- el controlador será referido como <code>foo</code> y a la
- acción como <code>bar</code>.
- </para>
- <note>
- <title>Convenciones para Case Naming</title>
- <para>
- Dado que los humanos somos notablemente inconsistentes
- en mantener cierta sensibilidad respecto a las
- minúsculas y mayúusculas al escribir enlaces,
- Zend Framework realmente normaliza ls información del
- path a minúsculas. Esto, por supuesto, afectará cómo
- nombre usted a su controlador y acciones... o referirse
- a ellos en los enlaces.
- </para>
- <para>
- 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 RUL
- necesitará hacerlo con un '-' o '.' (aunque puede
- configurar el carácter utilizado).
- </para>
- <para>
- Como ejemplo, si se va a la acción en
- <code>FooBarController::bazBatAction()</code>,
- se referirá a ella en la URL como
- <code>/foo-bar/baz-bat</code>
- o <code>/foo.bar/baz.bat</code>.
- </para>
- </note>
- </listitem>
- <listitem>
- <para>
- <classname>Zend_Controller_Action</classname>
- es el componente base del controlador de acción.
- Cada controlador es una sola clase que extiende la
- <classname>Zend_Controller_Action class</classname>
- y debe contener uno o más métodos de acción.
- </para>
- </listitem>
- <listitem>
- <para>
- <classname>Zend_Controller_Response_Abstract</classname>
- 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.
- </para>
- <para>
- La clase respuesta por defecto es
- <classname>Zend_Controller_Response_Http</classname>,
- la cual es adecuada para usarla en un entorno HTTP.
- </para>
- </listitem>
- </itemizedlist>
- <para>
- El workflow de <classname>Zend_Controller</classname> es relativamente
- sencillo. Una solicitud es recibida por
- <classname>Zend_Controller_Front</classname>, la que a su vez llama a
- <classname>Zend_Controller_Router_Rewrite</classname>
- para determinar qué controlador (y la acción en ese contralor)
- despachar.
- <classname>Zend_Controller_Router_Rewrite</classname>
- descompone la URI a fin de establecer el controlador y el nombre de
- acción en la solicitud.
- <classname>Zend_Controller_Front</classname>
- entonces entra al loop de despacho. Llama a
- <classname>Zend_Controller_Dispatcher_Standard</classname>,
- le pasa la solicitud para despachar al contralor y a la acción
- especificada en la solicitud (o el usado por defecto).
- Después de que el contralor ha terminado, el control vuelve a
- <classname>Zend_Controller_Front</classname>.
- Si el contralor ha indicado que debe despacharse otro controlador
- mediante el reinicio de la condición (status) de la solicitud,
- el bucle continúa y se ejecuta otro despacho.
- En caso contrario el proceso termina.
- </para>
- </sect1>
- <!--
- vim:se ts=4 sw=4 et:
- -->
|