如何在Symfony2应用程序中使用不同的布局提供相同的功能?

时间:2013-06-26 13:45:09

标签: symfony twig

我在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包的布局。

我该怎么做?

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

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

1 个答案:

答案 0 :(得分:2)

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

好的阅读是文档的How to setup before/after filters章节。

您还可以使用注册全局变量的枝条扩展,并决定在基本模板中扩展哪个模板:

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