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!
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());
}
}
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 }
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.
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();
}
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 ()
Voici un ensemble qui gère plusieurs sites de domaine: https://github.com/AppVentus/MultiDomainBundle