Есть ли способ настроить маршрутизацию на основе имени хоста в 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));
Я надеюсь, что это возможно, и я как-то пропустил его.
Заранее спасибо!
Это мое решение:
В 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()); } }
Просто отметим, что это теперь добавлено в 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 }
страницаmobile_homepage: path: / host: m.{domain} defaults: { _controller: AcmeDemoBundle:Main:mobileHomepage } requirements: domain: %domain% homepage: path: / defaults: { _controller: AcmeDemoBundle:Main:homepage }
Альтернативно получить имя хоста в контроллере:
class DefaultController extends PowmaController { /** * @Route("/test") */ public function testAction() { return new Response( 'Hostname ' . $this->getRequestHostnameString() ); } function getRequestHostnameString() { return $this->getRequest()->getHost(); }
Я предполагаю, что маршрутизация поддоменов в symfony2 – это процесс выбора определенного контроллера в соответствии с частью поддомена имени хоста, а переменная сеанса не помогает разрешить определенный контроллер.
Я устанавливаю атрибут запроса: _controller, в этом прослушивателе ядра
$request->attributes->set('_controller','AcmeBundle:Demo:main');
Это помогает маршрутизировать определенный контроллер, но я теряю профилировщик отладки в среде dev, но я не могу обнаружить причину
Для Symfony 1.2 есть плагин, который добавляет эту функциональность. Код составляет всего несколько сотен строк в одном файле и не должен быть слишком разным для порта Symfony 2. Но документация от Sensio еще не совсем там.
Вы также не можете включить субдомен в маршрут и получить домен от контроллера и обработать его там. Я думаю, что это такой метод: getHost ()
Вот пакет, который обрабатывает несколько доменных сайтов: https://github.com/AppVentus/MultiDomainBundle