web-dev-qa-db-fra.com

Symfony2 Routing - sous-domaines de routage

Existe-t-il un moyen de configurer le routage basé sur le nom d’hôte dans Symfony2 ?

Je n'ai rien trouvé à ce sujet dans la documentation officielle.
http://symfony.com/doc/2.0/book/routing.html

Je souhaite acheminer la demande en fonction du nom d'hôte indiqué:
foo.example.com
bar.example.com
{{sous-domaine}}. example.com

Donc, essentiellement, le contrôleur obtiendrait le sous-domaine actuel passé en paramètre.

Similaire à la solution Zend:
http://framework.zend.com/manual/fr/zend.controller.router.html#zend.controller.router.routes.routes.hostname

$hostnameRoute = new Zend_Controller_Router_Route_Hostname(
    ':username.users.example.com',
    array(
        'controller' => 'profile',
        'action'     => 'userinfo'
    )
);
$plainPathRoute = new Zend_Controller_Router_Route_Static('');

$router->addRoute('user', $hostnameRoute->chain($plainPathRoute));

J'espère que c'est possible et que je l'ai juste manqué.
Merci d'avance!

24
user523736

Ceci est ma solution:

Dans le répertoire config.yml in app app, ajoutez les lignes suivantes:

services:
   kernel.listener.subdomain_listener:
       class: Acme\DemoBundle\Listener\SubdomainListener
       tags:
           - { name: kernel.event_listener, event: kernel.request, method: onDomainParse }

Créez ensuite la classe SubdomainListener.php en tant que:

<?php

namespace Acme\DemoBundle\Listener;

use Symfony\Component\EventDispatcher\EventDispatcher;
use Symfony\Component\EventDispatcher\Event;

class SubdomainListener
{
   public function onDomainParse(Event $event)
   {
       $request = $event->getRequest();
       $session = $request->getSession();

       // todo: parsing subdomain to detect country

       $session->set('subdomain', $request->getHost());
   }
}
24
Alexander Vasilenko

Signalons simplement que ceci est maintenant ajouté dans Symfony v2.2 - http://symfony.com/doc/master/components/routing/hostname_pattern.html .

mobile_homepage:
    path:     /
    Host:     m.{domain}
    defaults: { _controller: AcmeDemoBundle:Main:mobileHomepage }
    requirements:
        domain: %domain%

homepage:
    path:  /
    defaults: { _controller: AcmeDemoBundle:Main:homepage }
42
Dan Blows

Je suppose que le routage de sous-domaine dans symfony2 est un processus de choix du contrôleur défini en fonction de la partie de sous-domaine du nom d’hôte, et que la variable de session n’aide pas à résoudre le contrôleur défini.

J'ai défini l'attribut de requête: _controller, dans le programme d'écoute du noyau, comme ceci

$request->attributes->set('_controller','AcmeBundle:Demo:main');

Ceci est une aide pour acheminer vers un contrôleur défini, mais je perds le profileur de débogage dans un environnement de développement, je ne parviens toujours pas à détecter une cause.

2
Aleksandr N. Ryzhov

Vous pouvez également obtenir le nom d'hôte dans le contrôleur:

class DefaultController extends PowmaController {

  /**
   * @Route("/test")
   */
  public function testAction() {
    return new Response( 'Hostname ' . $this->getRequestHostnameString() );
  }

  function getRequestHostnameString() {
    return $this->getRequest()->getHost();
  }
2
Mike

Il existe un plugin pour Symfony 1.2 qui ajoute cette fonctionnalité. Le code ne contient que quelques centaines de lignes dans un seul fichier et ne devrait pas être trop difficile à porter sur Symfony 2. Mais la documentation de Sensio n’est pas encore tout à fait là.

Vous pouvez également ne pas inclure le sous-domaine dans la route, extraire le domaine du contrôleur et le traiter à cet emplacement. Je pense que c'est cette méthode: getHost ()

1
Josh David Miller

Voici un ensemble qui gère plusieurs sites de domaine: https://github.com/AppVentus/MultiDomainBundle

0
Paul Andrieux