2

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

  • CommonBundle
  • FirstBundle
  • SecondBundle

中实现了几个功能CommonBundle。这些功能必须在其他 2 个捆绑包中可用。

FirstBundleandSecondBundle因此有它们自己的特征 + 的那些CommonBundlerouting.yml这些捆绑软件都在主应用程序文件中定义了自己的主机。

我正在尝试做的事情:

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

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

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

我怎样才能做到这一点?

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

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

4

1 回答 1

2

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

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

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

配置.yml

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

你的扩展名.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 %}
于 2013-06-26T15:13:18.413 回答