Как определить глобальные переменные для шаблонов Twig со значениями, поступающими из БД? - PullRequest
0 голосов
/ 09 января 2019

Я бы хотел определить глобальную переменную для ветки, которая была бы доступна из любого шаблона.

Я могу создать глобальную переменную в config/packages/twig.yaml Symfony, но мне нужно, чтобы это было значение, полученное из базы данных.

В документации к ветке сказано использовать этот код:

$twig = new Twig_Environment($loader);
$twig->addGlobal('name', 'value');

Где мне использовать этот код, чтобы эта переменная была доступна для каждого шаблона?

1 Ответ

0 голосов
/ 16 января 2019

Относительно чистым способом было бы добавить подписчика события , который бы вводил переменные глобально до создания экземпляров контроллеров.

Проблема выполнения в контроллере, как один из предложенных комментариев, заключается в том, что ваши глобальные переменные вообще не будут глобальными , а определены только для этого контроллера.

Вы могли бы сделать что-то вроде этого:

// 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' ];
    }
}

Взаимодействие с БД я оставил намеренно нечетким, поскольку только вы точно знаете, что вы хотите получить из БД. Но вы вводите Entity Manager этому подписчику, поэтому вам нужно только найти соответствующий репозиторий и выполнить соответствующий поиск.

Как только это будет сделано, вы можете просто сделать из своих шаблонов веток что-то вроде:

<p>I injected a rad global variable: <b>{{ veryGlobal }}</b></p> 
...