метод обслуживания как глобальная переменная twig

В моем приложении symfony2 у меня есть метод getPorfolioUser, который возвращает определенную пользовательскую переменную.

Я с нетерпением жду возможности позвонить

{% if portfolio_user%}

в веточке. Я не понимал, как я могу установить это как глобальную переменную, так как из документации, которую я под впечатлением, я могу установить только фиксированные элементы или службы, но не методы служб.

Должен ли я написать продление или помощник для этого? Какой простой способ сделать это?

Благодаря!

Вы можете определить свою настраиваемую службу в качестве twig globals variable как показано ниже:

в config.yml

 # Twig Configuration twig: debug: "%kernel.debug%" strict_variables: "%kernel.debug%" globals: myGlobaService: "@acme.demo_portfolio_service" #The id of your service 

Используйте его файл Twig

 {% if myGlobaService.portfolio_user() %} 

Надеюсь, что эта помощь

Один из подходов – прослушиватель событий CONTROLLER. Мне нравится использовать CONTROLLER вместо REQUEST, потому что он гарантирует, что все слушатели обычного запроса уже сделали свое дело.

 use Symfony\Component\HttpKernel\KernelEvents; use Symfony\Component\HttpKernel\Event\FilterControllerEvent; use Symfony\Component\EventDispatcher\EventSubscriberInterface; class ProjectEventListener implements EventSubscriberInterface { public static function getSubscribedEvents() { return array ( KernelEvents::CONTROLLER => array( array('onControllerProject'), ), ); } private $twig; public function __construct($twig) { $this->twig = $twig; } public function onControllerProject(FilterControllerEvent $event) { // Generate your data $project = ...; // Twig global $this->twig->addGlobal('project',$project); } # services.yml cerad_project__project_event_listener: class: ...\ProjectEventListener tags: - { name: kernel.event_subscriber } arguments: - '@twig' 

Слушатели описаны здесь: http://symfony.com/doc/current/cookbook/service_container/event_listener.html

Другой подход состоял бы в том, чтобы избежать твиновской глобальной целиком и просто сделать вызов расширения твиг. http://symfony.com/doc/current/cookbook/templating/twig_extension.html

В любом случае работает хорошо.

Когда вы смотрите здесь: http://symfony.com/doc/current/reference/twig_reference.html#app

Вы можете прочитать следующее:

Переменная приложения доступна повсюду и предоставляет доступ ко многим обычно требуемым объектам и значениям. Это экземпляр GlobalVariables.

GlobalVariables – это Symfony\Bundle\FrameworkBundle\Templating\GlobalVariables

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

Мне тоже было сложно с этим справиться и, наконец, решить его, сделав следующее:

 

  1. Настройте свой пакет (например: MyVendor / MyBundle)

     $ app/console generate:bundle 

 

  1. В вашем каталоге пакетов создайте файл класса MyService.php в папке DependencyInjection .

 

  1. В этом файле класса создайте функцию

     public function getExample(){ return "it works!!!"; } 

 

  1. В app / config / services.yml создайте новый сервис:

     myvendor.mybundle.myservice class: MyVendor\MyBundle\DependencyInjection\MyService 

 

  1. В app / config / config.yml в разделе конфигурации ветки

     twig: globals: mystuff: '@myvendor.mybundle.myservice' 

 

  1. Затем в ваших шаблонах вы можете ссылаться на переменную следующим образом:

      {{ mystuff.example }} 

 

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ

это именно то, как я получил его на работу ….

надеюсь это поможет.