有没有办法在 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));
我希望这是可能的,我只是错过了它 提前谢谢!
答案 0 :(得分:42)
只是要指出现在已添加到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 }
答案 1 :(得分:24)
这是我的解决方案:
在config.yml
里面的app 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 :(得分:2)
我假设symfony2中的子域路由是根据hostname的子域部分选择已定义的控制器的过程,而会话变量无助于解析定义的控制器。
我在内核侦听器中设置了请求属性:_controller,就像这样
$request->attributes->set('_controller','AcmeBundle:Demo:main');
这有助于路由到已定义的控制器,但我在开发环境中丢失了调试分析器,但仍无法检测到原因
答案 3 :(得分:2)
或者在控制器中获取主机名:
class DefaultController extends PowmaController {
/**
* @Route("/test")
*/
public function testAction() {
return new Response( 'Hostname ' . $this->getRequestHostnameString() );
}
function getRequestHostnameString() {
return $this->getRequest()->getHost();
}
答案 4 :(得分:1)
Symfony 1.2有plugin添加此功能。代码在单个文件中只有几百行,并且不应该太难以移植到Symfony 2.但是Sensio的文档还没有完全存在。
您也可以不在路径中包含子域,并从控制器获取域并在那里处理它。我认为这是这种方法:getHost()
答案 5 :(得分:0)
以下是处理多个域网站的捆绑包:https://github.com/AppVentus/MultiDomainBundle