Создание модуля расширения для TWIG

Главные вкладки

Аватар пользователя kondrik kondrik 12 января 2021 в 8:10

Хочу добавить некоторые функции для 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.

Что не так ?

Комментарии

Аватар пользователя charOFF charOFF 12 января 2021 в 12:00

Полное имя класса должно соответствовать пути и имени файла. Если у вас путь к файлу 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

Аватар пользователя charOFF charOFF 12 января 2021 в 14:03

Недосмотрел, что у вас имя файла TwigMyExtension.php, я ориентировался на php комментарий в файле. Но, все равно, путаница с именами при этом сохраняется, потому что имя класса kkintExtension, а оно должно соответствовать имени файла.
Тогда, если у вас TwigMyExtension.php лежит в папке src, то достаточно поменять имя класса на TwigMyExtension:

namespace Drupal\kkint;

use Twig\TwigFunction;

class TwigMyExtension extends \Twig_Extension {
  // code here
}