【问题标题】:How to serve same functionality with different layouts in a Symfony2 app?如何在 Symfony2 应用程序中以不同的布局提供相同的功能?
【发布时间】:2013-06-26 13:45:08
【问题描述】:

我在 Symfony2 应用程序中有以下捆绑架构:

  • CommonBundle
  • FirstBundle
  • SecondBundle

CommonBundle 中实现了一些功能。 这些功能必须在其他 2 个捆绑包中提供。

FirstBundleSecondBundle 因此有它们自己的特性 + CommonBundle 的特性。这些包在主应用程序routing.yml 文件中定义了自己的主机。

我想做的事:

CommonBundle 的功能应与当前包的布局一起显示。

例如,如果我点击http://firstbundle.myapp.com/common/feature1,我应该会看到FirstBundle 包的布局。

如果我点击http://secondbundle.myapp.com/common/feature1,则应该使用SecondBundle 包的布局。

我该怎么做?

我不能使用包继承,因为同一个包不能扩展两次。

在我当前的实现中,每个包都会在自己的主机中导入CommonBundle 的路由。

【问题讨论】:

    标签: symfony twig


    【解决方案1】:

    您应该创建一个控制器响应侦听器并根据其中的请求主机名更改模板名称。

    文档的How to setup before/after filters 章节值得一读。

    您也可以使用 twig 扩展来注册全局变量并决定在基本模板中扩展哪个模板:

    config.yml

    services:
        twig.extension.your_extension:
            class: Vendor\YourBundle\Twig\Extension\YourExtension
            arguments: [ @request ]         
            tags:
                - { name: twig.extension, alias: your_extension }
    

    YourExtension.php

    use Symfony\Component\HttpFoundation\Request;
    
    class YourExtension extends \Twig_Extension
    {
       protected $request;
    
       public function __construct(Request $request)
       {
            $this->request = $request;
       }
    
       public function getGlobals()
       {
           // some logic involving $this->request
    
           $baseTemplate = ($this->request->getHost() === 'first.host.tld') ? 'FirstBundle::base.html.twig' : 'SecondBundle::base.html.twig';
    
           return array(
              'base_template' => $baseTemplate,
           );
       }
    
       public function getName()
       {
           return 'your_extension';
       }
    

    base.html.twig

    {% extends base_template %}
    

    【讨论】:

    • 我喜欢这个主意!鉴于通用功能的模板位于 CommonBundle 包中,这是否意味着我应该为所有请求向视图发送一个参数,并且这些通用模板将根据该参数决定扩展哪个布局?跨度>
    • 您可以使用指示要扩展哪个模板的参数来解决它...或更改侦听器中使用的模板名称 - 如果主机名 = second.* -> 将 FirstBundle 替换为 @987654326 中的 SecondBundle @。参数解决方案可以在注册全局的树枝扩展中实现!
    • 我实际上在 FirstBundle 和 SecondBundles 中没有任何关于通用功能的模板。所以我想我要写一个 Twig 扩展,就像你说的那样,它根据主机确定为 CommonBundle 中的模板扩展哪个布局。它看起来不是很漂亮,但可以正常工作。我会告诉你的!
    • ping 你解开谜题了吗?我的回答有帮助吗?如果是,请投票/接受,否则发表评论:)
    • 感谢@nifr,我最终实现了您的解决方案!
    猜你喜欢
    • 1970-01-01
    • 2019-11-01
    • 2016-11-05
    • 1970-01-01
    • 1970-01-01
    • 2015-06-27
    • 1970-01-01
    • 2012-08-28
    • 1970-01-01
    相关资源
    最近更新 更多