Php Symfony2路由-路由子域
有没有办法在Symfony2中设置基于主机名的路由 我在官方文档中没有找到有关此主题的任何内容。Php Symfony2路由-路由子域,php,routing,symfony,Php,Routing,Symfony,有没有办法在Symfony2中设置基于主机名的路由 我在官方文档中没有找到有关此主题的任何内容。 我想根据给定的主机名路由请求: foo.example.com bar.example.com {{subdomain}}.example.com 因此,本质上,控制器将获取作为参数传递的当前子域 与Zend解决方案类似: 我希望这是可能的,但不知何故我错过了。 提前谢谢 Symfony 1.2有一个添加此功能的版本。代码在一个文件中只有几百行,移植到symfony2应该不会太困难。但是Sens
我想根据给定的主机名路由请求:
foo.example.com
bar.example.com
{{subdomain}}.example.com 因此,本质上,控制器将获取作为参数传递的当前子域 与Zend解决方案类似:
我希望这是可能的,但不知何故我错过了。
提前谢谢 Symfony 1.2有一个添加此功能的版本。代码在一个文件中只有几百行,移植到symfony2应该不会太困难。但是Sensio的文档还不太清楚 您也不能将子域包括在路由中,并从控制器获取域并在那里处理它。我想是这个方法:这是我的解决方案: 在app dir内部的
config.yml
中添加以下行:
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());
}
}
我假设symfony2中的子域路由是根据主机名的子域部分在中选择定义的控制器的过程,会话变量不帮助解析定义的控制器
我在内核侦听器中设置请求属性:_controller,如下所示
$request->attributes->set('_controller','AcmeBundle:Demo:main');
这有助于路由到已定义的控制器,但我在开发环境中丢失了调试探查器,仍然无法检测原因或者在控制器中获取主机名:
class DefaultController extends PowmaController {
/**
* @Route("/test")
*/
public function testAction() {
return new Response( 'Hostname ' . $this->getRequestHostnameString() );
}
function getRequestHostnameString() {
return $this->getRequest()->getHost();
}
只是要指出的是,现在Symfony v2.2-中添加了这一功能
这里有一个处理多个域站点的捆绑包:,因此还没有内置方法。很遗憾。在SF2中有一个捆绑包会很好。这是一个非常好的方法。谢谢。我想如果使用这种方法,缓存会有问题,每个子域应该有一个,否则与“bar”路径相同的“foo”页面可能会从“bar”返回缓存页面,对吗?我不知道“todo”中应该包含什么。这难道不足以获取“subdomain”的值并在控制器中使用它吗?更好的是,它能自动设置用户的区域设置吗?要达到顶部还有很长的路要走,但这里什么都没有!;)
class DefaultController extends PowmaController {
/**
* @Route("/test")
*/
public function testAction() {
return new Response( 'Hostname ' . $this->getRequestHostnameString() );
}
function getRequestHostnameString() {
return $this->getRequest()->getHost();
}
mobile_homepage:
path: /
host: m.{domain}
defaults: { _controller: AcmeDemoBundle:Main:mobileHomepage }
requirements:
domain: %domain%
homepage:
path: /
defaults: { _controller: AcmeDemoBundle:Main:homepage }