Symfony 2:如何基于主机和URI进行路由?

时间:2013-02-01 23:10:45

标签: symfony routing

作为Yahoo points this out,我希望能够做两件事:

  • 使用URI 主机
  • 解析前端控制器中的路由
  • 在创建/使用模板时,不返回“相对”路由(如'/img/st.jpg'),而是返回完整路由(如'//s1.mysite.com/st.png')等等:增量计数器(=>下一个静态链接应该像{ {1}}的 2 '//s
  • a更进一步,我希望包含该语言(例如.mysite.com/whatever.png' 我们 '//s1..mysite.com/st.png' fr '//s1.

你会怎么做?我可以轻松地执行Apache规则,如:

.mysite.com/st.png'

我不在这里,但我对RewriteRules没有任何问题。问题在于构建具有正确“优化”URL的网页。你会怎么做?

如果我不够清楚,我很抱歉,所以我会给你一个真实的例子:我想转换这段代码:

RewriteCond %{HTTP_HOST} ^([a-zA-Z0-9\-]+)\.((([a-zA-Z0-9\-]+)\.)+)([a-zA-Z0-9\-]+)\.(fr|com|net|org|eu)$
RewriteRule BLABLABLABLA

<img src="/p/s/pizza.png" alt="aaa" />
<div class="img-large">
    <img src="/l/l/pizza.png" alt="bbb" />
</div>

(我没有写Twig模板代码以保持尽可能清晰)。 你会怎么做?

2 个答案:

答案 0 :(得分:0)

Symfony 2.2支持主机路由:http://symfony.com/doc/master/components/routing/hostname_pattern.html

如果您使用的是Symfony 2.1或更低版本,则不能使用子域进行路由本身,但您可以设置一个侦听器,以根据子域对页面加载执行某些操作。

示例监听器:

#config.yml
services:        
  myListener:
    class: myApp\MyBundle\Controller\MyListener
    arguments: 
        container: "@service_container"
    tags:
        - { name: kernel.event_listener, event: kernel.request, method: onKernelRequest, priority: 64 }



class MyListener extends controller
{

    public function __construct($container)
    {
        $this->container = $container;
    }    

    public function onKernelRequest(GetResponseEvent $event)
    {       
        $currentHost = $request->getHost();
        // do something, i.e set the language
    }

}

答案 1 :(得分:0)

扩展路由生成器。我想说添加一个名为hostname的附加参数,让我们说一下generateRoute方法。下面给出了如何覆盖路由生成器的简单示例:

Custom url generator classhttp://symfony.com/doc/master/cookbook/bundles/inheritance.html

然后,您可以创建一个专门用于静态资产的自定义Twig标记,您可以在其中调用新的generateRoute方法,使用您想要的任何策略设置名为hostname的新自定义参数(随机,基于某种递增逻辑(也许使用会话))。这只是概念的证明,需要一些谷歌搜索和阅读文档,但没有理由它不应该工作......