6

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

4

4 回答 4

12

编辑: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: ~

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

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

于 2015-01-15T14:36:45.127 回答
3

到今天为止,类签名已经改变。您必须实现 \Twig_Extension_GlobalsInterface,没有它,您的全局变量将不会显示。

class MyTwigExtension extends \Twig_Extension implements Twig_Extension_GlobalsInterface
{ }

再见!

于 2017-06-04T22:55:52.880 回答
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() 函数将其传递给模板

于 2015-01-15T14:42:25.190 回答
2

远离全局变量。

而是制作一个自定义树枝扩展,然后将数据库连接作为参数注入。

就像是:

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/template/twig_extension.html

于 2015-01-15T14:45:18.420 回答