Ver índice de contenidos del libro

6.6. Importando recursos de enrutamiento externos

Todas las rutas de la aplicación se cargan a través de un único archivo de configuración — normalmente app/config/routing.yml. Sin embargo, resulta habitual tener que cargar rutas definidas en otros archivos, almacenados por ejemplo dentro de algún bundle. Para cargarlas, debes importar esos ficheros externos utilizando las siguientes instrucciones:

# app/config/routing.yml
acme_hello:
    resource: "@AcmeHelloBundle/Resources/config/routing.yml"
<!-- app/config/routing.xml -->
<?xml version="1.0" encoding="UTF-8" ?>
 
<routes xmlns="http://symfony.com/schema/routing"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://symfony.com/schema/routing http://symfony.com/schema/routing/routing-1.0.xsd">
 
    <import resource="@AcmeHelloBundle/Resources/config/routing.xml" />
</routes>
// app/config/routing.php
use Symfony\Component\Routing\RouteCollection;
 
$collection = new RouteCollection();
$collection->addCollection($loader->import("@AcmeHelloBundle/Resources/config/routing.php"));
 
return $collection;

Nota Cuando importas recursos desde archivos YAML, el valor que asignes como clave de la opción resource es indiferente, ya que no se utiliza para nada (en el ejemplo anterior, se utiliza el valor acme_hello). En cualquier caso, asegúrate de que utilizas un valor único para cada importación.

La clave resource indica el recurso desde el que se deben cargar las rutas. En este ejemplo, este recurso es la ruta completa de un archivo del sistema, donde la cadena @AcmeHelloBundle es un atajo muy útil que Symfony interpreta como la ruta hasta el directorio donde se encuentra ese bundle. El contenido del archivo importado podría ser por ejemplo el siguiente:

# src/Acme/HelloBundle/Resources/config/routing.yml
acme_hello:
    path:     /hello/{name}
    defaults: { _controller: AcmeHelloBundle:Hello:index }
<!-- src/Acme/HelloBundle/Resources/config/routing.xml -->
<?xml version="1.0" encoding="UTF-8" ?>
 
<routes xmlns="http://symfony.com/schema/routing"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://symfony.com/schema/routing http://symfony.com/schema/routing/routing-1.0.xsd">
 
    <route id="acme_hello" path="/hello/{name}">
        <default key="_controller">AcmeHelloBundle:Hello:index</default>
    </route>
</routes>
// src/Acme/HelloBundle/Resources/config/routing.php
use Symfony\Component\Routing\RouteCollection;
use Symfony\Component\Routing\Route;
 
$collection = new RouteCollection();
$collection->add('acme_hello', new Route('/hello/{name}', array(
    '_controller' => 'AcmeHelloBundle:Hello:index',
)));
 
return $collection;

Las rutas de este archivo se analizan y cargan en la misma forma que las del archivo de enrutamiento principal.

6.6.1. Prefijando las rutas importadas

Resulta habitual tener que añadir un prefijo a todas las rutas importadas desde un archivo externo. Si quieres por ejemplo que el patrón de la ruta acme_hello sea /admin/hello/{name} en vez de /hello/{name}, añade la opción prefix al importar las rutas:

# app/config/routing.yml
acme_hello:
    resource: "@AcmeHelloBundle/Resources/config/routing.yml"
    prefix:   /admin
<!-- app/config/routing.xml -->
<?xml version="1.0" encoding="UTF-8" ?>
 
<routes xmlns="http://symfony.com/schema/routing"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://symfony.com/schema/routing http://symfony.com/schema/routing/routing-1.0.xsd">
 
    <import resource="@AcmeHelloBundle/Resources/config/routing.xml" prefix="/admin" />
</routes>
// app/config/routing.php
use Symfony\Component\Routing\RouteCollection;
 
$collection = new RouteCollection();
$collection->addCollection($loader->import("@AcmeHelloBundle/Resources/config/routing.php"), '/admin');
 
return $collection;

El valor indicado en la opción prefix (en este caso /admin) se añade por delante de todos los patrones de las rutas importadas desde el archivo externo.

6.6.2. Agregando un host a las rutas importadas

A partir de la versión 2.2 de Symfony, también puedes añadir un host a las rutas importadas. Para obtener más información, consulta el artículo Adding a Host Regex to Imported Routes.