Подтвердить что ты не робот

Маршрутизация Symfony2 - субдомены маршрутов

Есть ли способ настроить маршрутизацию на основе имени хоста в Symfony2?

Я не нашел ничего об этой теме в официальной документации.
http://symfony.com/doc/2.0/book/routing.html

Я хочу направить запрос на основе заданного имени хоста:
foo.example.com
bar.example.com
{{}} Подобласть. Example.com

Таким образом, по сути, контроллер получит текущий субдомен, переданный как параметр.

Аналогично решению Zend:
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));

Я надеюсь, что это возможно, и я как-то пропустил его.
Спасибо заранее!

4b9b3361

Ответ 1

Это мое решение:

В config.yml внутри приложения dir добавьте следующие строки:

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

Затем создайте класс SubdomainListener.php как:

<?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());
   }
}

Ответ 2

Просто отметим, что теперь это добавлено в 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 }

Ответ 3

Я предполагаю, что маршрутизация поддоменов в symfony2 - это процесс выбора определенного контроллера в соответствии с субдоменной частью имени хоста, а переменная сеанса не помогает разрешить определенный контроллер.

Я устанавливаю атрибут request: _controller, в этом прослушивателе ядра

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

Это помогает маршрутизировать определенный контроллер, но я теряю профилировщик отладки в среде dev, но я не могу обнаружить причину

Ответ 4

Альтернативно получить имя хоста в контроллере:

class DefaultController extends PowmaController {

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

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

Ответ 5

В Symfony 1.2 есть plugin, который добавляет эту функциональность. Код составляет всего несколько сотен строк в одном файле и не должен быть слишком разным для порта Symfony 2. Но документация от Sensio еще не совсем там.

Вы также не можете включить субдомен в маршрут и получить домен от контроллера и обработать его там. Я думаю, что этот метод: getHost()