首页 文章

在自定义Twig扩展中使用Twig

提问于
浏览
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()函数的最佳方法是什么?

非常感谢 !

1 回答

  • 3

    Twig_ExtensionInterface 定义了接受树枝环境作为参数的 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 .

相关问题