Я не могу использовать внутренние функции с Twig SimpleFilter в классе расширения Twig

у меня есть проект на основе twig с Symfony 2. Из-за природы Symfony 2 используются пространства имен. Из-за этого я не могу предоставить глобальные функции вне пространства имен.

Это мое расширение Twig класс:

<?php
namespace Web\MailBundle\Twig;

use Twig_Extension, Twig_SimpleFilter;

class Twig extends Twig_Extension
{
    public function getName()
    {
        return 'twig_extension';
    }

    public function getFilters() {
        return array(
            'shortKey'  => new Twig_SimpleFilter('shortKey', 'myCustomFilterFunction')
        );
    }

    public function myCustomFilterFunction() {
        //code here...
    }

результат: FatalErrorException: Error: Call to undefined function myCustomFilterFunction()

почему: Потому что Twig пытается найти эту функцию, но она находится внутри класса. Если я перемещу его за пределы класса, на этот раз я столкнусь с пространствами имен. Потому что является пространством имен.

исследования: Я дигг коды. Прутик делает то же самое. Они пишут фильтры и функции вне класса. Но из-за пространства имен я не могу этого сделать. Если возможно, я хочу сделать это, используя правильное решение. Если это не удастся; я приду с последним решением, которое создает другой файл php без пространства имен и включает его в проект...

--

Как я могу преодолеть это? Фильтр Twig был устаревшим, и мы должны использовать Способ SimpleFilter. Но я просто не мог этого сделать.

1 ответов


вы можете передать вызываемый массив в качестве второго параметра в Twig_SimpleFilter конструктор-в вашем случае используйте массив так:

public function getFilters() {
    return array(
        'shortKey'  => new Twig_SimpleFilter('shortKey', array($this, 'myCustomFilterFunction'))
    );
}

который будет использовать метод объекта при использовании фильтр.

см. примеры в документация Twig.