在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 回答
Twig_ExtensionInterface
定义了接受树枝环境作为参数的initRuntime()
方法 . 在初始化扩展时,通过twig调用此方法 .你扩展了
Twig_Extension
类,already provides an empty implementation of this method . 您所要做的就是覆盖它并存储对树枝环境的引用以供将来使用 .文件:Creating an extension .