在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()函数的最佳方法是什么?
非常感谢!
答案 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);
}
}