Symfony2 Routing - маршрутные субдомены - PullRequest
24 голосов
/ 20 марта 2011

Есть ли способ настроить маршрутизацию на основе имени хоста в 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));

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

Ответы [ 6 ]

42 голосов
/ 30 января 2013

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

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

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

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 голосов
/ 08 марта 2012

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

class DefaultController extends PowmaController {

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

  function getRequestHostnameString() {
    return $this->getRequest()->getHost();
  }
2 голосов
/ 13 февраля 2012

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

Я установил атрибут запроса: _controller, в слушателе ядра вот так

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

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

1 голос
/ 13 апреля 2011

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

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

0 голосов
/ 26 июня 2013

Вот пакет, который обрабатывает сайт с несколькими доменами: https://github.com/AppVentus/MultiDomainBundle

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...