Symfony 5.1: загрузка собственного расширения twig в микроядро

#symfony #twig-extension

#symfony #twig-расширение

Вопрос:

переходя на smyfony, мы сталкиваемся с некоторыми основными проблемами при запуске. Мы переносим существующий проект на symfony. В связи с этим, f.eg . конфигурации и т.д. обязательно должны быть на php и динамически — пока никаких проблем.

но: как я могу загрузить собственную функцию twig (расширение) в микроядре?

kernel.php

 protected function configureContainer(ContainerConfigurator $container) {

  $container->extension("twig", array(
            "paths" => array(__DIR__ . "/../resources/views"),
            "auto_reload" => true,
            "cache" => false,
        ));

}
  

Twig работает нормально и не создает проблем … до тех пор, пока нам не понадобятся наши собственные функции.

(ТЕСТ!) Функция twig:

 namespace AppKernelTwigExtensions;

use TwigExtensionAbstractExtension;
use TwigTwigFunction;

class TwigTest extends AbstractExtension {
    public function getFunctions() {
        return array(
            new TwigFunction("test", array($this, function() { return "ABC"; })),
        );
    }
}
  

использование следующего источника в «ConfigureContainer» не имеет никакого эффекта:

 $container->services()
                ->load("App\Kernel\TwigExtensions\", sprintf("%s/Kernel/TwigExtensions/TwigTest.php", __DIR__))
                ->tag('twig.extension')
  

Есть идеи для моего следующего шага? Спасибо!

Комментарии:

1. Вы зарегистрировали расширения в контейнере, но не в самом twig, обычно это делается путем вызова addExtension . Вы можете увидеть, как это делается на этапе компиляции .

2. Спасибо за ваш комментарий и помощь. addExtension кажется, в этом и есть смысл. Но, к сожалению, getDefinition('twig') в configureContainer fct в kernel.php . я также не могу обратиться к twig как к переменной, чтобы напрямую добавить расширение, но мне нужно инициализировать расширения там.

3. Нет, это не так, у вас ContainerConfigurator там есть a, а не a ContainerBuilder , но вы можете создать свой собственный проход компилятора и повторить то, что делает framework.