Cómo emparejar una ruta basándose en el servidor

Nuevo en la versión 2.2: El soporte necesario para emparejar con el servidor se añadió en Symfony 2.2

También puedes emparejar con el host HTTP de la petición entrante.

  • YAML
    mobile_homepage:
        path:     /
        host:     m.example.com
        defaults: { _controller: AcmeDemoBundle:Main:mobileHomepage }
    
    homepage:
        path:     /
        defaults: { _controller: AcmeDemoBundle:Main:homepage }
    
  • 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="mobile_homepage" path="/" host="m.example.com">
            <default key="_controller">AcmeDemoBundle:Main:mobileHomepage</default>
        </route>
    
        <route id="homepage" path="/">
            <default key="_controller">AcmeDemoBundle:Main:homepage</default>
        </route>
    </routes>
    
  • PHP
    use Symfony\Component\Routing\RouteCollection;
    use Symfony\Component\Routing\Route;
    
    $collection = new RouteCollection();
    $collection->add('mobile_homepage', new Route('/', array(
        '_controller' => 'AcmeDemoBundle:Main:mobileHomepage',
    ), array(), array(), 'm.example.com'));
    
    $collection->add('homepage', new Route('/', array(
        '_controller' => 'AcmeDemoBundle:Main:homepage',
    )));
    
    return $collection;
    

Ambas rutas emparejan con la misma ruta /, aun así la primera sólo emparejará si el servidor es m.example.com.

Marcadores de posición y requisitos en patrones de nombre del servidor

Si estás utilizando el componente DependencyInjection (o la plataforma Symfony2 en su totalidad), entonces puedes utilizar los parámetros del contenedor de servicios como variables en cualquier lugar en tus rutas.

Puedes evitar codificar el nombre de dominio usando un marcador de posición y un requisito. El %domain% en los requisitos se sustituye por el valor del parámetro domain en el contenedor de inyección de dependencias.

  • YAML
    mobile_homepage:
        path:     /
        host:     m.{domain}
        defaults: { _controller: AcmeDemoBundle:Main:mobileHomepage }
        requirements:
            domain: %domain%
    
    homepage:
        path:  /
        defaults: { _controller: AcmeDemoBundle:Main:homepage }
  • 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="mobile_homepage" path="/" host="m.example.com">
            <default key="_controller">AcmeDemoBundle:Main:mobileHomepage</default>
            <requirement key="domain">%domain%</requirement>
        </route>
    
        <route id="homepage" path="/">
            <default key="_controller">AcmeDemoBundle:Main:homepage</default>
        </route>
    </routes>
    
  • PHP
    use Symfony\Component\Routing\RouteCollection;
    use Symfony\Component\Routing\Route;
    
    $collection = new RouteCollection();
    $collection->add('mobile_homepage', new Route('/', array(
        '_controller' => 'AcmeDemoBundle:Main:mobileHomepage',
    ), array(
        'domain' => '%domain%',
    ), array(), 'm.{domain}'));
    
    $collection->add('homepage', new Route('/', array(
        '_controller' => 'AcmeDemoBundle:Main:homepage',
    )));
    
    return $collection;
    

Añadiendo un servidor a la expresión regular de las rutas importadas

Puedes poner una expresión regular para el servidor en las rutas importadas:

  • YAML
    # app/config/routing.yml
    acme_hello:
        resource: "@AcmeHelloBundle/Resources/config/routing.yml"
        host:     "hello.example.com"
    
  • XML
    <!-- 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" host="hello.example.com" />
    </routes>
    
  • PHP
    // app/config/routing.php
    use Symfony\Component\Routing\RouteCollection;
    
    $collection = new RouteCollection();
    $collection->addCollection($loader->import("@AcmeHelloBundle/Resources/config/routing.php"), '', array(), array(), array(), 'hello.example.com');
    
    return $collection;
    

El servidor hello.example.com será puesto en cada ruta cargada desde el nuevo recurso de enrutado.

Bifúrcame en GitHub