如何在symfony模板中有来自db的全局变量?

时间:2015-01-15 14:32:50

标签: symfony doctrine-orm twig twig-extension

如何在symfony模板中拥有全局变量? 我读过this 但我更喜欢从数据库中获取参数,我认为这个服务将在启动之前加载,然后才能从db中获取任何内容。是否有可能这样做?

4 个答案:

答案 0 :(得分:10)

编辑:2019年使用Symfony 3.4+语法更新。

创建一个注入实体管理器的Twig扩展:

FUZ /的appbundle /枝条/扩展/ DatabaseGlobalsExtension.php

<?php

namespace Fuz\AppBundle\Twig\Extension;

use Doctrine\ORM\EntityManager;
use Twig\Extension\AbstractExtension;
use Twig\Extension\GlobalsInterface;

class DatabaseGlobalsExtension extends AbstractExtension implements GlobalsInterface
{

   protected $em;

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

   public function getGlobals()
   {
      return [
          'myVariable' => $this->em->getRepository(FuzAppBundle\Entity::class)->getSomeData(),
      ];
   }
}

Fuz / AppBundle / Resources / config / services.yml 中注册您的扩展程序:

services:
    _defaults:
        autowire: true
        autoconfigure: true 

Fuz\AppBundle\Twig\Extension\DatabaseGlobalsExtension: ~

现在,您可以使用实体管理器执行所需的请求。

不要忘记替换路径和名称空间以与您的应用程序匹配。

答案 1 :(得分:2)

您可以注册枝条延伸

services:
    twig_extension:
        class: Acme\DemoBundle\Extension\TwigExtension
        arguments: [@doctrine]
        tags:
            - { name: twig.extension }

然后在TwigExtension中,您可以执行以下操作:

class TwigExtension extends \Twig_Extension
{
    public function getGlobals() {
        return array(
            // your key => values to make global
        );
    }
}

因此,您可以从此TwigExtension中的数据库中获取值,并使用getGlobals()函数将其传递给模板

答案 2 :(得分:2)

远离global variables.

而是创建自定义twig扩展,然后将数据库连接作为参数注入。

类似的东西:

services:
    acme.twig.acme_extension:
        class: Acme\DemoBundle\Twig\AcmeExtension
        arguments: [@doctrine.dbal.default_connection]
        tags:
            - { name: twig.extension }

详细说明:

http://symfony.com/doc/current/cookbook/templating/twig_extension.html

答案 3 :(得分:2)

截至今天,班级签名已更改。你必须实现\ Twig_Extension_GlobalsInterface,没有它,你的全局变形不会出现。

class MyTwigExtension extends \Twig_Extension implements Twig_Extension_GlobalsInterface
{ }

再见!