简体   繁体   English

Symfony2路由-路由子域

[英]Symfony2 Routing - route subdomains

Is there a way to set up hostname based routing in Symfony2 ? 有没有办法在Symfony2中设置基于主机名的路由?

I didn't find anything about this topic in the official documentation. 在官方文档中没有找到关于此主题的任何信息。
http://symfony.com/doc/2.0/book/routing.html http://symfony.com/doc/2.0/book/routing.html

I want to route the request based on the given hostname: 我想基于给定的主机名路由请求:
foo.example.com foo.example.com
bar.example.com bar.example.com
{{subdomain}}.example.com {{subdomain}}。example.com

So in essence, the controller would get the current subdomain passed as a parameter. 因此,从本质上讲,控制器将获得作为参数传递的当前子域。

Similar to the Zend solution: 与Zend解决方案类似:
http://framework.zend.com/manual/en/zend.controller.router.html#zend.controller.router.routes.hostname 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));

I hope that it's possible and I just missed it somehow. 我希望这是可能的,而我只是以某种方式错过了它。
Thanks in advance! 提前致谢!

Just to point out that this is now added in Symfony v2.2 - http://symfony.com/doc/master/components/routing/hostname_pattern.html . 只是要指出,现在已在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 }

This is my solution: 这是我的解决方案:

In the config.yml inside app dir add the following lines: 在应用程序目录中的config.yml添加以下行:

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

Then create the class SubdomainListener.php as: 然后,将类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());
   }
}

I assume that subdomain routing in symfony2 is process of choose defined controller in according to subdomain part of hostname, and session variable is not help to resolve defined controller. 我假设symfony2中的子域路由是根据主机名的子域部分选择定义的控制器的过程,会话变量无助于解析定义的控制器。

I set request attribute: _controller, in kernel listener like this 我在内核侦听器中设置请求属性:_controller,如下所示

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

This is help to route to defined controller, but I lose debug profiler in dev environment, still I can not detect a cause 这有助于路由到已定义的控制器,但是我在开发环境中丢失了调试分析器,但仍然无法检测到原因

Alternatively get hostname in the controller: 或者在控制器中获取主机名:

class DefaultController extends PowmaController {

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

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

There is a plugin for Symfony 1.2 that adds this functionality. Symfony 1.2有一个插件可以添加此功能。 The code is only a few hundred lines in a single file and shouldn't be too diffcult to port to Symfony 2. But the documentation from Sensio isn't quite there yet. 该代码在单个文件中只有几百行,应该移植到Symfony 2并不难。但是Sensio的文档还不存在。

You could also not include the subdomain in the route and fetch the domain from the controller and process it there. 您也不能在路由中包含子域,而不能从控制器中获取域并在那里进行处理。 I think it's this method: getHost() 我认为是这种方法: getHost()

这是处理多个域站点的捆绑包: https : //github.com/AppVentus/MultiDomainBundle

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM