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