我在Symfony2应用程序中有以下捆绑架构:
CommonBundle
FirstBundle
SecondBundle
CommonBundle
中实现了多项功能。
这些功能必须在其他2个捆绑包中提供。
FirstBundle
和SecondBundle
因此具有自己的功能+ CommonBundle
的功能。这些包中的每个包都在主应用程序routing.yml
文件中定义了自己的主机。
我正在尝试做什么:
CommonBundle
的功能应与当前包的布局一起显示。
例如,如果我点击http://firstbundle.myapp.com/common/feature1
,我应该会看到FirstBundle
包的布局。
如果我点击http://secondbundle.myapp.com/common/feature1
,则应使用SecondBundle
包的布局。
我该怎么做?
我不能使用bundle继承,因为同一个bundle不能扩展两次。
在我当前的实现中,每个bundle都在其自己的主机中导入CommonBundle
的路由。
答案 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 %}