1

在 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->render() 函数的最佳方法是什么?

非常感谢 !

4

1 回答 1

3

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

您已经扩展了这个Twig_Extension类,它已经提供了这个方法的一个空实现。您所要做的就是覆盖它并存储对 twig 环境的引用以供将来使用。

<?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);
    }
}

文档:创建扩展.

于 2013-02-02T19:57:23.390 回答