Хочу добавить некоторые функции для twig. Нашел кучу инфы, но не могу понять почему она не работает.
kkint.services.yml:
services:
kkint.twig_extension:
class: \Drupal\kkint\TwigMyExtension
autowire: true
tags:
- {name: twig.extension}
TwigMyExtension.php:
<?php
// src/AppBundle/Twig/KintExtension.php
namespace Drupal\kkint;use Twig\Extension\AbstractExtension;
use Twig\TwigFunction;class kkintExtension extends \Drupal\Core\Template\TwigExtension {
//class TwigMyExtension extends AbstractExtension {public function getFunctions():array{
return [
//new TwigFunction('kintd', array($this, "kintd")),
//new TwigFunction('hello1', array($this, "hello1")),
new TwigFunction('hello1', array($this, "hello1")),];
}public function getName() {
return 'kkint.twig_extension';
}public function hello1(){
echo "123";
return "Hello";
}
}
В итоге получаю ошибку Service 'kkint.twig_extension' for consumer 'twig' does not implement Twig\Extension\ExtensionInterface.
Что не так ?
Комментарии
Полное имя класса должно соответствовать пути и имени файла. Если у вас путь к файлу
src/AppBundle/Twig/KintExtension.php
, то будетnamespace Drupal\kkint\AppBundle\Twig;
, а имя классаKintExtension
.Соответственно в kkint.services.yml будет
class: Drupal\kkint\AppBundle\Twig\KintExtension
И наследовать наверно все таки нужно не от \Drupal\Core\Template\TwigExtension со всеми его функциями, а от абстрактного класса \Twig_Extension
Недосмотрел, что у вас имя файла TwigMyExtension.php, я ориентировался на php комментарий в файле. Но, все равно, путаница с именами при этом сохраняется, потому что имя класса kkintExtension, а оно должно соответствовать имени файла.
Тогда, если у вас TwigMyExtension.php лежит в папке src, то достаточно поменять имя класса на TwigMyExtension:
use Twig\TwigFunction;
class TwigMyExtension extends \Twig_Extension {
// code here
}