在自定义Twig扩展中使用Twig

时间:2013-02-01 21:01:18

标签: symfony twig

在Symfony2项目中,我创建了一个实现Twig_ExtensionInterface的服务,因此我可以将它用作Twig过滤器,如{{ stuff|my_filter }}

在这项服务中,我需要使用twig环境,所以我可以使用twig模板,所以我将它注入服务中可以做的事情:

在services.yml中:

services:
    meta.twig.my_extension:
        class: Acme\GeneralBundle\Twig\MyExtension
        tags:
            - { name: twig.extension }
        arguments:
            twig: "@twig"

所以服务本身就像:

<?php

namespace Acme\GeneralBundle\Twig;

class MyExtension extends \Twig_Extension
{

    public function __construct($twig)
    {
        $this->twig = $twig;
    }

    public function getFilters()
    {
        return array(
            'my_filter' => new \Twig_Filter_Method($this, 'myFunction'),
        );
    }

    public function myFunction($text)
    {
       return $this->twig->render($someTemplate,$someArguments);
    }
}

我可以在这样的控制器中使用它:

$myService = $this->container->get('Acme.twig.my_extension');
$text = $myService->myFunction($someValue);

但是,当然,我这样做时会收到一个CircularReference错误:

Circular reference detected for service "Acme.twig.my_extension", 
path: "Acme.twig.my_extension -> twig".

那么,在自定义Twig Filter中使用twig-&gt; render()函数的最佳方法是什么?

非常感谢!

1 个答案:

答案 0 :(得分:3)

Twig_ExtensionInterface定义了接受twig环境作为参数的initRuntime()方法。初始化扩展时,twig调用此方法。

您已扩展Twig_Extension课程,already provides an empty implementation of this method。您所要做的就是覆盖它并存储对树枝环境的引用以供将来使用。

<?php

namespace Acme\GeneralBundle\Twig;

class MyExtension extends \Twig_Extension
{
    private $environment = null;

    public function initRuntime(\Twig_Environment $environment)
    {
        $this->environment = $environment;
    }

    public function getFilters()
    {
        return array(
            'my_filter' => new \Twig_Filter_Method($this, 'myFunction'),
        );
    }

    public function myFunction($text)
    {
       return $this->environment->render($someTemplate,$someArguments);
    }
}

文档:Creating an extension