在一个Symfony2项目中,我创建了一个实现Twig_ExtensionInterface的服务,这样我就可以像{{ stuff|my_filter }}一样将它用作一个Twig过滤器
在这个服务中,我需要使用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过滤器中使用twig->render()函数的最佳方式是什么?
非常感谢!
发布于 2013-02-03 03:57:23
Twig_ExtensionInterface定义了initRuntime()方法,该方法接受twig环境作为参数。此方法由twig在初始化扩展时调用。
您已经扩展了already provides an empty implementation of this method的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);
}
}文档:Creating an extension。
https://stackoverflow.com/questions/14654963
复制相似问题