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:
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:
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í:
www.example.com
:language
imprint
users.example.com
:username
misc
]]>
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:
www.example.com
:language
imprint
www, language, index
www, language, imprint
]]>
También puede darle el parámetro a
chain
como un array en vez de separ las rutas con comas:
www
language
index
www
language
imprint
]]>
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:
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
]]>