Symfony не загружает расширение Twig во время выполнения

Я следовал примеру из документов Symfony 3.4 чтобы загрузить расширение Twig во время выполнения, но оно не загружается: что я делаю неправильно?

В: src/PlotlyBundle/Twig/AppRuntime.php

<?php
namespace PlotlyBundle\Twig;

class AppRuntime
{
    public function __construct()
    {
    }

    public function biDraw()
    {
        return 'awesome text here';
    }
}

В: src/PlotlyBundle/Resources/config/services.yml

services:
    plotly.twig_runtime:
        class: PlotlyBundle\Twig\AppRuntime
        public: true
        tags:
            - { name: twig.runtime }

IN: src/PlotlyBundle/Twig/AppExtension.php

<?php
namespace PlotlyBundle\Twig;

use PlotlyBundle\Twig\AppRuntime;

class AppExtension extends \Twig_Extension
{
    public function getFunctions()
    {    
        return [
            new \Twig_SimpleFunction(
                'bi_draw',
                array(AppRuntime::class, 'biDraw')
            ),
        ];
    }
}

IN: src/AppBundle/Controller/DashboardController.php

   $twig = $this->get('plotly.twig_runtime');
    return $this->render(
        'dashboard/index.html.twig'
    );

В: app/Resources/views/dashboard/index.html.twig

{{ bi_draw() }}

person numediaweb    schedule 27.05.2018    source источник
comment
Это кажется неправильным... разве документация неверна? Можешь попробовать с class: PlotlyBundle\Twig\AppExtension?   -  person Federkun    schedule 27.05.2018
comment
^ нет, это не так - вы автоматически подключаете его? в противном случае вам нужно пометить его twig.extension   -  person Federkun    schedule 27.05.2018
comment
Я уже пробовал: при использовании xdebug я вижу, что конструктор вызывается, но getFunctions не вызывается. Должен ли я добавить инъекцию зависимостей в мой пакет (PlotlyBundle)?   -  person numediaweb    schedule 27.05.2018
comment
Я добавил тег в service.yml   -  person numediaweb    schedule 27.05.2018
comment
Можете ли вы обновить свой пост с ним? Включен ли параметр автонастройки вашего сервисного контейнера? ( symfony.com/doc/3.4/ )   -  person Federkun    schedule 27.05.2018
comment
Если я использую twig.extension в качестве тега, он работает, но все равно не понимаю, почему тег twig.runtime не работает.   -  person numediaweb    schedule 27.05.2018
comment
twig.runtime предназначен для ленивой загрузки. Вы можете сохранить его. Проблема заключалась в том, что вы вообще не зарегистрировали расширение ветки.   -  person Federkun    schedule 27.05.2018
comment
хм.. Я следовал этому примеру в документах, и поскольку точка останова xdebug в конструкторе AppExtension срабатывает => расширение повторно регистрируется.. Я не понимаю, что мне не хватает :( может быть, AppBundle по умолчанию выполняет дополнительную работу, которую PlotlyBundle нет?   -  person numediaweb    schedule 27.05.2018
comment
Он не был зарегистрирован. Конструктор был вызван, потому что вы вызвали его в своем контроллере с помощью $twig = $this->get('plotly.twig_runtime');. В этот момент вы создали объект AppRuntime. Я предполагаю, что sy doc просто предполагает, что у вас включена опция autoconfigure.   -  person Federkun    schedule 27.05.2018
comment
Давайте продолжим обсуждение в чате.   -  person numediaweb    schedule 28.05.2018


Ответы (1)


Благодаря комментариям @Federkun я исправил это, автоматически подключив расширение Twig:

В: src/PlotlyBundle/Resources/config/services.yml

services:
    # default configuration for services in *this* file
    _defaults:
        # automatically injects dependencies in your services
        autowire: true
        # automatically registers your services as commands, event subscribers, etc.
        autoconfigure: true
        # this means you cannot fetch services directly from the container via $container->get()
        # if you need to do this, you can override this setting on individual services
        public: false

    # this creates a service per class whose id is the fully-qualified class name
    PlotlyBundle\Twig\:
        resource: '../../../../src/PlotlyBundle/Twig/*'
        tags:
            - { name: twig.runtime }

Пример в документации Symfony (Создание Lazy- Загруженные расширения Twig) нуждаются в обновлении, чтобы упомянуть, что автоматическое подключение ДОЛЖНО быть включено (как описано в параметр автонастройки), чтобы пример работал.

Я отправил PR в документацию Symfony.

person numediaweb    schedule 28.05.2018
comment
Пометка всех служб подпространства имен Twig как twig.runtime не является правильным решением. Большинство этих служб являются не средами выполнения, а расширениями. И причина, по которой это решает вашу проблему, заключается в том, что теперь вы регистрируете свое расширение как службу (и помечаете как расширение благодаря автонастройке), чего не было сделано в исходной конфигурации. - person Christophe Coevoet; 28.05.2018