Маршрутизация 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));
Я надеюсь, что это возможно, и я как-то пропустил его.
Спасибо заранее!
Ответы
Ответ 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()
Ответ 6
Вот пакет, который обрабатывает несколько доменных сайтов: https://github.com/AppVentus/MultiDomainBundle