Twig template engine, используя статическую функцию или переменную

Есть ли способ вызвать статическую функцию или использовать статическую переменную в twig?

У меня есть класс статических вспомогательных функций и вы хотите использовать один или два в шаблоне.

Ответы

Ответ 1

Несколько способов, которыми я закончил это.

Сначала это функция, которая может вызвать статическую функцию.

$twig = new Twig_Environment($loader);
$twig->addFunction('staticCall', new Twig_Function_Function('staticCall'));

function staticCall($class, $function, $args = array())
{
    if (class_exists($class) && method_exists($class, $function))
        return call_user_func_array(array($class, $function), $args);
    return null;
}

Можно использовать, например,

{{ staticCall('myClass', 'mymethod', [optional params]) }}

Другой способ - использовать магический метод.

Добавьте класс в контекст рендеринга

$data['TwigRef']  = new TheClass();

class TheClass
{
    public function __call($name, $arguments) {
        return call_user_func_array(array('TheClass', $name), $arguments);
    }

    ...
}

Можно использовать, например,

{{ TwigRef.myMethod(optional params) }}

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

Ответ 2

Вы можете динамически добавлять функции в свои шаблоны ветки, регистрируя их. Либо они уже вызываются, либо вы используете свою статическую функцию по собственному имени:

$twig = new Twig_Environment($loader);
$twig->addFunction('functionName', new Twig_Function_Function('someFunction'));

Смотрите раздел Функции в разделе Расширение Twig.