сервисный метод как глобальная переменная ветки

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

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

{%, если портфолио_пользователь %}

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

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

Спасибо!


person Sébastien    schedule 04.03.2015    source источник


Ответы (4)


Вы можете определить свою пользовательскую службу как 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() %}

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

person Matteo    schedule 05.03.2015

Один из подходов заключается в использовании прослушивателя событий 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

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

person Cerad    schedule 04.03.2015

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

Вы можете прочитать это:

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

GlobalVariables is Symfony\Bundle\FrameworkBundle\Templating\GlobalVariables

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

person BENARD Patrick    schedule 04.03.2015

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

<эм>

  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.

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

<эм>

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

     {{ mystuff.example }}
    

<эм>

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

только так у меня получилось....

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

person Craig Wayne    schedule 05.07.2016