【问题标题】:Symfony 2: how to route based both on the host and URI?Symfony 2:如何基于主机和 URI 进行路由?
【发布时间】:2013-02-01 23:10:45
【问题描述】:

作为Yahoo points this out,我想做两件事:

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

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

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

我在这里没有进一步说明,但我对 RewriteRules 没有任何问题。问题在于如何构建包含正确“优化”URL 的网页。你会怎么做呢?

如果我不够清楚,对不起,我给你一个真实的例子:我想转换这段代码:

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

<img src="http://fr.s2.partner.mysite.fr/p/s/pizza.png" alt="aaa" />
<div class="img-large">
    <img src="http://fr.s3.partner.mysite.fr/p/l/pizza.png" alt="bbb" />
</div>

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

【问题讨论】:

标签: symfony routing


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    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
        }
    
    }
    

    【讨论】:

    • 你是说不可能像我在自己的框架上那样生成一种“旋转”静态域 URI:remy.livrepizzas.fr(这只是一个示例,我知道网页是丑,但是右键查看HTML源代码)?
    • 我不太清楚你的意思,但是假设你想设置语言,或者基于唯一子域的公司/用户特定设置,你可以使用监听器来实现,基本上它在你的包之前运行,所以你得到 URL,设置一个会话变量然后运行你的应用程序,如果这有意义吗?我只是包含了一个基本的(未经测试的)示例
    • 很抱歉,我可能没有正确表达自己。问题不是当客户端想要读取页面时“分析主机”,而是当服务器生成页面时:我想“知道”什么时候有静态元素,如果有,生成特定的 URI,就像我在问题中描述的那样。如果我没有正确表达自己,再次抱歉。
    • Symfony 2.2 将支持按主机名路由,如果这对您有帮助? symfony.com/doc/master/components/routing/hostname_pattern.html
    猜你喜欢
    • 2023-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-16
    • 2014-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多