如何使用来自数据库的值为 Twig 模板定义全局变量?

Voj*_*vek 8 php twig symfony4

我想为 twig 定义一个全局变量,它可以从任何模板访问。

我可以在 symfony's 中创建一个全局变量config/packages/twig.yaml,但我需要它是从数据库中获取的值。

在树枝的文档中,它说使用此代码:

$twig = new Twig_Environment($loader);
$twig->addGlobal('name', 'value');
Run Code Online (Sandbox Code Playgroud)

我应该在哪里使用此代码,以便此变量可用于每个模板?

yiv*_*ivi 7

一个相对干净的方法是添加一个 事件订阅者,该订阅者将在控制器实例化之前全局注入变量。

正如评论之一所建议的那样,在控制器中执行的问题是您的全局变量不会是 全球所有,但只对控制器进行定义。

你可以这样做:

// src/Twig/TwigGlobalSubscriber.php

use Doctrine\ORM\EntityManager;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpKernel\Event\GetResponseEvent;
use Symfony\Component\HttpKernel\KernelEvents;
use Twig\Environment;

class TwigGlobalSubscriber implements EventSubscriberInterface {

    /**
     * @var \Twig\Environment
     */
    private $twig;
    /**
     * @var \Doctrine\ORM\EntityManager
     */
    private $manager;

    public function __construct( Environment $twig, EntityManager $manager ) {
        $this->twig    = $twig;
        $this->manager = $manager;
    }

    public function injectGlobalVariables( GetResponseEvent $event ) {
        $whatYouWantAsGlobal = $this->manager->getRepository( 'SomeClass' )->findBy( [ 'some' => 'criteria' ] );
        $this->twig->addGlobal( 'veryGlobal', $whatYouWantAsGlobal[0]->getName() );
    }

    public static function getSubscribedEvents() {
        return [ KernelEvents::CONTROLLER =>  'injectGlobalVariables' ];
    }
}
Run Code Online (Sandbox Code Playgroud)

我故意留下的数据库交互是模糊的,因为只有您确切地知道您想从数据库中检索什么。但是您正在向该订阅者注入实体管理器,因此只需检索适当的存储库并执行适当的搜索即可。

完成此操作后,您可以简单地从树枝模板中执行以下操作:

<p>I injected a rad global variable: <b>{{ veryGlobal }}</b></p> 
Run Code Online (Sandbox Code Playgroud)