Symfony2 Routing-subdomeny trasy

Czy istnieje sposób na skonfigurowanie routingu opartego na nazwie hosta w Symfony2 ?

Nie znalazłem nic na ten temat w oficjalnej dokumentacji.
http://symfony.com/doc/2.0/book/routing.html

Chcę przekierować żądanie na podstawie podanej nazwy hosta:
foo.example.com
bar.example.com
{{subdomena}}.example.com

Więc w istocie, kontroler otrzyma bieżącą subdomenę przekazaną jako parametr.

Podobne do Zend solution:
http://framework.zend.com/manual/en/zend.controller.router.html#zend.controller.router.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));
Mam nadzieję, że to możliwe i jakoś to przegapiłem.
Z góry dzięki!
Author: Acyra, 2011-03-20

6 answers

To jest moje rozwiązanie:

W katalogu config.yml wewnątrz aplikacji Dodaj następujące linie:

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

Następnie utwórz klasę SubdomainListener.php jako:

<?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
Author: Alexander Vasilenko,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-20 10:18:36

Dla przypomnienia, że jest to teraz dodane w 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
Author: Dan Blows,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-30 17:15:37

Alternatywnie Pobierz nazwę hosta w kontrolerze:

class DefaultController extends PowmaController {

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

  function getRequestHostnameString() {
    return $this->getRequest()->getHost();
  }
 2
Author: Mike,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-03-07 21:08:49

Zakładam, że routing subdomen w symfony2 jest procesem wyboru zdefiniowanego kontrolera zgodnie z częścią subdomeny nazwy hosta, a zmienna sesji nie pomaga w rozwiązaniu zdefiniowanego kontrolera.

Ustawiam atrybut request: _controller, w Kernel listener tak:

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

To jest pomoc do zdefiniowanego kontrolera, ale tracę debug profiler w środowisku dev, nadal nie mogę wykryć przyczyny

 2
Author: Aleksandr N. Ryzhov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-10-26 08:51:16

Istnieje Wtyczka dla Symfony 1.2, która dodaje tę funkcjonalność. Kod składa się tylko z kilkuset linii w jednym pliku i nie powinien być zbyt trudny do przeniesienia na Symfony 2. Ale dokumentacji z Sensio jeszcze nie ma.

Można również nie włączyć subdomeny w trasie i pobrać domenę z kontrolera i przetworzyć ją tam. Myślę, że to ta metoda: getHost()

 1
Author: Josh David Miller,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-04-13 07:02:19

Oto pakiet, który obsługuje wiele domen: https://github.com/AppVentus/MultiDomainBundle

 0
Author: Paul Andrieux,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-06-26 08:38:52