2014-11-06 54 views
0

AFAIK除非指定了主機,否則Symfony2對路由中的主機無所謂。爲路由設置全局主機

我目前沒有在我的應用程序中使用子域,但是這將會改變。我想要的是,當主機中存在子域(http://subdomain.foo.bar)時,如果路由配置在主機中具有子域,則路由器只匹配路由。

這應該與:(其它)

/** 
* @Route("/", host="{subdomain}.%host%") 
* @Template 
*/ 
public function index() 

這應該不匹配,並返回404:

/** 
* @Route("/") 
* @Template 
*/ 
public function index() 

由於上述冷漠,這條路線也匹配對於http://subdomain.foo.bar

所以我想要的是設置主機全球需求(foo.bar),然後爲存在子域時它們應該匹配的特定路由指定。

我嘗試添加主機要求的進口在app/config/routing.yml

foo: 
    resource: "@AcmeFooBundle/Controller/" 
    type:  annotation 
    host:  foo.bar 
    prefix: /

然而,在註釋中指定的,造成不匹配任何兩條航線的主機要求「贏」(當一個子域出現在實際的主機中時。

什麼工作,每個控制器globablly設置主機名:

/** 
* @Route(host="foo.bar") 
*/ 
class bazController 

但我寧願全局配置這個地方。

有誰知道如何解決這個問題?

回答

1

我解決了這個問題通過創建自定義路線編譯:

use Symfony\Component\Routing\RouteCompiler as BaseRouteCompiler; 
use Symfony\Component\Routing\Route; 

class RouteCompiler extends BaseRouteCompiler 
{ 
    public static function compile(Route $route) 
    { 
     if ($route->getHost() === "") { 
      $route->setHost($route->getDefaults()['default_host']); 
     } 

     return parent::compile($route); 
    } 
} 
在你的路由文件

然後:

foo: 
    resource: "@BarBundle/Controller/" 
    type:  annotation 
    prefix: /
    options: 
     compiler_class: Foo\Bundle\CoreBundle\Router\RouteCompiler 
    defaults: 
     default_host: %router.request_context.host% 
+0

是多麼有效它來編譯每個請求的路線。 – bharatesh 2017-01-12 15:31:18