| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227 |
- <?xml version="1.0" encoding="UTF-8"?>
- <!-- EN-Revision: 15103 -->
- <!-- 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 una estructura suficiente 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 flujo de procesos 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> organiza todo
- el flujo de trabajo 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 de la delegación de las solicitudes a los
- ActionControllers
- (<classname>Zend_Controller_Action</classname>).
- </para>
- </listitem>
- <listitem>
- <para>
- <classname>Zend_Controller_Request_Abstract</classname> (a
- menudo denominado <methodname>Request Object</methodname>) 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 <classname>Zend_Controller_Dispatcher</classname>.
- 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.
- </para>
- <para>
- Por defecto, se usa
- <classname>Zend_Controller_Request_Http</classname>, el cual
- proporciona acceso a todo el ámbito 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 á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
- <classname>Zend_Controller_Dispatcher_Standard</classname>.
- El ruteo (routing) ocurre sólo una vez: cuando la solicitud
- se recibe inicialmente y antes de enviar el primer
- controlador.
- </para>
- <para>
- El router por defecto,
- <classname>Zend_Controller_Router_Rewrite</classname>,
- toma el punto final de una URI como se especificó en
- <classname>Zend_Controller_Request_Http</classname>
- 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
- <methodname>http://localhost/foo/bar/key/value</methodname> se
- decodificará para usar el controlador <methodname>foo</methodname>,
- la acción <methodname>bar</methodname> y especificar un parámetro
- <methodname>key</methodname> con el valor de <methodname>value</methodname>.
- </para>
- <para>
- <classname>Zend_Controller_Router_Rewrite</classname>
- también puede ser utilizado para igualar las rutas 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 dispatchers. Dispatching (Despachar) es el proceso
- de sacar el controlador y la acción del objeto que solicita 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 enviar.
- </para>
- <para>
- 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 (booleano true),
- que terminará el procesamiento.
- </para>
- <para>
- El dispatcher 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:
- <methodname>FooController::barAction()</methodname>. En este caso,
- el controlador será referido como <methodname>foo</methodname> y a la
- acción como <methodname>bar</methodname>.
- </para>
- <note>
- <title>Convenciones para Case Naming (Casos de Nombre)</title>
- <para>
- 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.
- </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 url
- necesitará hacerlo con un '-' o '.' (aunque puede
- configurar el carácter utilizado).
- </para>
- <para>
- Como ejemplo, si se va a la acción en
- <methodname>FooBarController::bazBatAction()</methodname>,
- se referirá a ella en la URL como
- <methodname>/foo-bar/baz-bat</methodname>
- o <methodname>/foo.bar/baz.bat</methodname>.
- </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>clase Zend_Controller_Action </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 de respuesta (response) por defecto es
- <classname>Zend_Controller_Response_Http</classname>,
- la cual es adecuada para usarla en un entorno HTTP.
- </para>
- </listitem>
- </itemizedlist>
- <para>
- El flujo de procesos 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 controlador)
- 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 bucle del dispatch. Llama a
- <classname>Zend_Controller_Dispatcher_Standard</classname>,
- 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
- <classname>Zend_Controller_Front</classname>.
- 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.
- </para>
- </sect1>
- <!--
- vim:se ts=4 sw=4 et:
- -->
|