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

How to have a global variable coming from db in symfony template?

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

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

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

Fuz/AppBundle/Twig/Extension/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: ~

现在您可以使用实体管理器执行您想要的请求。

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

你可以注册一个树枝扩展

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() 函数将其传递给模板

远离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

截至今天,class 签名已更改。您必须实施 \ Twig_Extension_GlobalsInterface,没有它,您的全局变量将不会显示。

class MyTwigExtension extends \Twig_Extension implements Twig_Extension_GlobalsInterface
{ }

再见!