# Zend_Controller_Router_Route_Chain

`Zend_Controller_Router_Route_Chain` es una ruta que permite encadenar juntas a múltiples rutas. Esto le permite encadenar hostname/rutas y rutas de paths, o múltiples paths de rutas por ejemplo. El encadenamiento puede hacerse programáticamente o dentro de un archivo de configuración.

## Prioridad de Parámetros

Cuando se encadenan en conjunto varias rutas, los parámetros de la ruta exterior tienen mayor prioridad que los parámetros de la ruta interior. Así, si define un controlador en el exterior y otro en la ruta interior, será seleccionado el controlador de la ruta exterior.

Cuando el encadenamiento se realiza prográmaticamente, hay dos maneras de archivarlo. La primera consiste en crear una nueva instancia `Zend_Controller_Router_Route_Chain` y entones llamar al método `chain()` varias veces con todas las rutas que deberían encadenarse juntas. La otra forma es tomar la primera ruta, por ejemplo, la ruta del nombre del host, y llamar al método `chain()` con la ruta que debería ser anexada a ella. Esto no modificará la ruta del nombre del host, pero devolverá una nueva instancia de `Zend_Controller_Router_Route_Chain` , teniendo entonces a ambas rutas encadenadas juntas:

    // Crear dos rutas
    $hostnameRoute = new Zend_Controller_Router_Route_Hostname(...);
    $pathRoute     = new Zend_Controller_Router_Route(...);

    // Primera manera, encadenarlas con chain route
    $chainedRoute = new Zend_Controller_Router_Route_Chain();
    $chainedRoute->chain($hostnameRoute)
                 ->chain($pathRoute);

    // Segunda manera, encadenarlas directamente
    $chainedRoute = $hostnameRoute->chain($pathRoute);

Cuando las rutas se encadenan juntas, su separador es una barra ('/'). Pueden haber casos cuando quiera tener un separador diferente:

    // Crear dos rutas
    $firstRoute  = new Zend_Controller_Router_Route('foo');
    $secondRoute = new Zend_Controller_Router_Route('bar');

    // Encadenarlas juntas con un separador diferente
    $chainedRoute = $firstRoute->chain($secondRoute, '-');

    // Ensamblar la ruta: "foo-bar"
    echo $chainedRoute->assemble();

## Encadenar Rutas via Zend_Config

Para encadenar juntas a las rutas en un archivo de configuración, hay parámetros adicionales para la configuración de aquellos. El enfoque más sencillo es utilizar los parámetros chains . Este es simplemente una lista de las rutas, que será encadenada con la ruta padre. Ni la ruta padre ni la ruta hijo serán añadidos directamente al router sino que sólo lo hará la ruta del encadenamiento resultante. El nombre de la ruta encadenada en el router será el nombre de la ruta padre concatenada con un guión ('-') con el nombre de la ruta hijo. Un simple config en XML se vería así:

    <routes>
        <www type="Zend_Controller_Router_Route_Hostname">
            <route>www.example.com</route>
            <chains>
                <language type="Zend_Controller_Router_Route">
                    <route>:language</route>
                    <reqs language="[a-z]{2}">
                    <chains>
                        <index type="Zend_Controller_Router_Route_Static">
                            <route></route>
                            <defaults module="default" controller="index"
                                      action="index" />
                        </index>
                        <imprint type="Zend_Controller_Router_Route_Static">
                            <route>imprint</route>
                            <defaults module="default" controller="index"
                                      action="index" />
                        </imprint>
                    </chains>
                </language>
            </chains>
        </www>
        <users type="Zend_Controller_Router_Route_Hostname">
            <route>users.example.com</route>
            <chains>
                <profile type="Zend_Controller_Router_Route">
                    <route>:username</route>
                    <defaults module="users" controller="profile" action="index" />
                </profile>
            </chains>
        </users>
        <misc type="Zend_Controller_Router_Route_Static">
            <route>misc</route>
        </misc>
    </routes>

Esto se traducirá en las tres rutas `www-language-index` , `www-language-imprint` y `users-language-profile` que sólo concordarán basados en el nombre y la ruta `misc` , que se comparará con cualquier nombre de host.

La manera alternativa de crear una ruta encadenada es a través del parámetro chain , que sólo puede utilizarse directamente con el tipo cadena-ruta, y también trabaja en el nivel raíz:

    <routes>
        <www type="Zend_Controller_Router_Route_Chain">
            <route>www.example.com</route>
        </www>
        <language type="Zend_Controller_Router_Route">
            <route>:language</route>
            <reqs language="[a-z]{2}">
        </language>
        <index type="Zend_Controller_Router_Route_Static">
            <route></route>
            <defaults module="default" controller="index" action="index" />
        </index>
        <imprint type="Zend_Controller_Router_Route_Static">
            <route>imprint</route>
            <defaults module="default" controller="index" action="index" />
        </imprint>

        <www-index type="Zend_Controller_Router_Route_Chain">
            <chain>www, language, index</chain>
        </www-index>
        <www-imprint type="Zend_Controller_Router_Route_Chain">
            <chain>www, language, imprint</chain>
        </www-imprint>
    </routes>

También puede darle el parámetro a chain como un array en vez de separ las rutas con comas:

    <routes>
        <www-index type="Zend_Controller_Router_Route_Chain">
            <chain>www</chain>
            <chain>language</chain>
            <chain>index</chain>
        </www-index>
        <www-imprint type="Zend_Controller_Router_Route_Chain">
            <chain>www</chain>
            <chain>language</chain>
            <chain>imprint</chain>
        </www-imprint>
    </routes>

When you configure chain routes with `Zend_Config` and want the chain name separator to be different from a dash, you need to specify this separator separately:

    $config = new Zend_Config(array(
        'chainName' => array(
            'type'   => 'Zend_Controller_Router_Route_Static',
            'route'  => 'foo',
            'chains' => array(
                'subRouteName' => array(
                    'type'     => 'Zend_Controller_Router_Route_Static',
                    'route'    => 'bar',
                    'defaults' => array(
                        'module'      => 'module',
                         'controller' => 'controller',
                         'action'     => 'action'
                    )
                )
            )
        )
    ));

    // Set separator before adding config
    $router->setChainNameSeparator('_separator_')

    // Add config
    $router->addConfig($config);

    // The name of our route now is: chainName_separator_subRouteName
    echo $this->_router->assemble(array(), 'chainName_separator_subRouteName');

    // The proof: it echoes /foo/bar