Cómo utilizar parámetros del contenedor de servicios en tus rutas

Nuevo en la versión 2.1: La capacidad para usar parámetros en tus rutas se añadió en Symfony 2.1.

En ocasiones, posiblemente te resulte útil hacer configurables globalmente algunas partes de tus rutas. Por ejemplo, si construyes un sitio internacionalizado, probablemente sea bueno comenzar con una o dos localidades. Seguramente vas a añadir un requisito a tus rutas para evitar que un usuario coincida con una región que no estás apoyando.

Podrías codificar tu requisito _locale en todas tus rutas. Pero la mejor solución es utilizar un parámetro configurable del contenedor de servicios justo dentro de la configuración de enrutado:

  • YAML
    contact:
        path:     /{_locale}/contact
        defaults: { _controller: AcmeDemoBundle:Main:contact }
        requirements:
            _locale: %acme_demo.locales%
  • 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="contact" path="/{_locale}/contact">
            <default key="_controller">AcmeDemoBundle:Main:contact</default>
            <requirement key="_locale">%acme_demo.locales%</requirement>
        </route>
    </routes>
    
  • PHP
    use Symfony\Component\Routing\RouteCollection;
    use Symfony\Component\Routing\Route;
    
    $collection = new RouteCollection();
    $collection->add('contact', new Route('/{_locale}/contact', array(
        '_controller' => 'AcmeDemoBundle:Main:contact',
    ), array(
        '_locale' => '%acme_demo.locales%',
    )));
    
    return $collection;
    

Ahora, puedes controlar y poner el parámetro acme_demo.locales en algún lugar en tu contenedor:

  • YAML
    # app/config/config.yml
    parameters:
        acme_demo.locales: en|es
    
  • XML
    <!-- app/config/config.xml -->
    <parameters>
        <parameter key="acme_demo.locales">en|es</parameter>
    </parameters>
    
  • PHP
    # app/config/config.php
    $container->setParameter('acme_demo.locales', 'en|es');
    

También puedes utilizar un parámetro para definir la trayectoria (completa o parte) de tu ruta):

  • YAML
    some_route:
        path:     /%acme_demo.route_prefix%/contact
        defaults: { _controller: AcmeDemoBundle:Main:contact }
    
  • 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="some_route" path="/%acme_demo.route_prefix%/contact">
            <default key="_controller">AcmeDemoBundle:Main:contact</default>
        </route>
    </routes>
    
  • PHP
    use Symfony\Component\Routing\RouteCollection;
    use Symfony\Component\Routing\Route;
    
    $collection = new RouteCollection();
    $collection->add('some_route', new Route('/%acme_demo.route_prefix%/contact', array(
        '_controller' => 'AcmeDemoBundle:Main:contact',
    )));
    
    return $collection;
    

Nota

Justo como en los archivos de configuración de contenedor de servicio normal, si realmente necesitas un % en tu ruta, puedes escapar el signo de porcentaje duplicándolo, p. ej. /puntuacion-50%%, la cual resolvería a /puntuacion-50%.

Bifúrcame en GitHub