<?xml version="1.0" encoding="UTF-8"?>
    <!-- EN-Revision: 24249 -->
    <!-- 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
                <emphasis>Request Object</emphasis>
                ) 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
                <acronym>HTTP</acronym>
                .
            </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
                <acronym>URI</acronym>
                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
                <acronym>URL</acronym>
                <filename>http://localhost/foo/bar/key/value</filename>
                se
                decodificará para usar el controlador
                <emphasis>foo</emphasis>
                ,
                la acción
                <emphasis>bar</emphasis>
                y especificar un parámetro
                <emphasis>key</emphasis>
                con el valor de
                <emphasis>value</emphasis>
                .
            </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 (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.
            </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 (
                <type>Boolean</type>
                <constant>TRUE</constant>
                ),
                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
                <emphasis>foo</emphasis>
                y a la
                acción como
                <emphasis>bar</emphasis>
                .
            </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
                    <acronym>URL</acronym>
                    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
                    <acronym>URL</acronym>
                    como
                    <filename>/foo-bar/baz-bat</filename>
                    o
                    <filename>/foo.bar/baz.bat</filename>
                    .
                </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
                <acronym>HTTP</acronym>
                .
            </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
        <acronym>URI</acronym>
        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:
-->
