# 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 ( Boolean `TRUE` ), 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.