Symfony2,模板,“设置”中的特殊变量

时间:2013-10-11 11:53:21

标签: php symfony twig

我在网上读到了TWIG模板中的自定义全局变量,是的,我发现只有静态变量。

我的问题是,我想创建一些全局变量,这些变量将包含来自我的 Settings.php 的数据(+还加入控制器以加载此数据)。因此,我的 :: base.html.twig 中的内容如下所示:

<title>{% block page_name %}settings.page_name{% endblock %}</title>

例如我的 AcmeContactBundle:默认:index.html.twig 如下所示:

{% extends '::base.html.twig' %}

{% block page_name %}{{ parent() }} - Contact me{% endblock %}

因此,如果我使用$settings->setPageName('My web'),我的标题将包含以下格式:我的网络 - 与我联系 ContactBundle

所以,我需要的是是如何在TWIG或类似的东西中创建任何某种类型的全局变量,其中每个特殊变量都将包含来自任何具有变量{{1}的控制器的信息解析我的 :: base.html.twig 模板(就像带有渲染模板及其变量的普通控制器一样)。有没有最好的解决方案呢?

1 个答案:

答案 0 :(得分:2)

只需在基本模板中定义一个变量(例如::base.html.twig):

{% set page_name = 'AwesomeCompany - ' %}

<title>{{ page_name }}</title>

然后在扩展基本模板的模板中,您只需覆盖变量或向其添加内容。

{% set page_name = page_name ~ 'Home' %} 

...无需覆盖或创建块。


使用树枝扩展/全局变量

为了从您的实体存储库中获取值,您可以...

创建一个Twig扩展名:

// src/Acme/DemoBundle/Twig/AcmeExtension.php
namespace Acme\DemoBundle\Twig;

use Doctrine\Common\Persistence\ObjectManager;

class AcmeExtension extends \Twig_Extension
{
    protected $em;

    public function __construct(ObjectManager $em)
    {
       $this->em = $em;
    }

    public function getGlobals()
    {
        return array(
            'page_name'=> $this->em->getRepository('AcmeBundle:Entity')->findOneBy(array('..'))->getPageName();
        );
    }

    public function getName()
    {
        return 'acme_extension';
    }
}

然后将您的扩展注册为服务并注入存储库

# app/config/config.yml ... or load from a bundle-extension
services:
    acme.twig.acme_extension:
        class: Acme\DemoBundle\Twig\AcmeExtension
        arguments: [ "@doctrine.orm.entity_manager" ]
        tags:
            - { name: twig.extension }

现在你可以省略基础tempalate中的静态{% set page_name ...,因为该变量将作为全局aka提供。在所有模板中。