如何创建自定义Twig函数类,而不使用静态方法?

时间:2013-12-18 15:32:37

标签: php twig templating-engine

我可以像这样为我的项目创建一个Twig扩展

class Functions extends Twig_Extension{
    public function getName(){return 'foobar';}

    public function getFunctions() {
        return array(
            'loremipsum' => new \Twig_SimpleFunction('asset', 'Functions::loremipsum')
        );

    public static function loremipsum($foo) {
        return $foo;
    }
}

这有效,但我想使用构造函数在某些函数中注入一些我需要的数据。

'asset'中使用Twig_SimpleFunction只会导致PHP尝试执行功能loremipsum()

2 个答案:

答案 0 :(得分:12)

public function getFunctions() {
    return array(
        'foo' => new Twig_Function_Method($this, 'bar');
    );
}

public function bar($baz) {
    return $this->foo . $baz;
}

查看extend Twig_Function所有不同的类,以了解指定模板函数的所有不同方法。

对于较新的Twig_SimpleFunction,您似乎可以将任何类型的callable作为第二个参数传递给构造函数:

new Twig_SimpleFunction('foo', array($this, 'bar'))

答案 1 :(得分:4)

来自twig 1.23.1版本的

更新,以及如下所示:

class LogoExtension extends \Twig_Extension
{

    public function getFunctions()
    {
        return array(
            new \Twig_SimpleFunction('logo', array($this, 'logo'), array('is_safe' => array('html'))),
        );
    }

    public function logo()
    {
        return 'result';
    }


    /**
     * {@inheritdoc}
     */
    public function getName()
    {
        return 'logo';
    }
}

当然,您在services.yml配置文件中将此扩展类添加为树枝扩展名。

services:
    company.twig.extension.logo:
        class:  Acme\DemoBundle\Twig\Extension\LogoExtension
        tags:
            -   {   name:   twig.extension}