Относительно чистым способом было бы добавить подписчика события , который бы вводил переменные глобально до создания экземпляров контроллеров.
Проблема выполнения в контроллере, как один из предложенных комментариев, заключается в том, что ваши глобальные переменные вообще не будут глобальными , а определены только для этого контроллера.
Вы могли бы сделать что-то вроде этого:
// 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>