在Symfony2的项目中使用的树枝,我已经创建了一个实现Twig_ExtensionInterface这样我就可以把它作为一个嫩枝过滤服务,像{{ stuff|my_filter }}
在自定义的树枝扩展
在这个服务,我需要用小树枝环境在所以我可以使用例如树枝模板,所以我注入它作为一个可以在服务做到:
services:
meta.twig.my_extension:
class: Acme\GeneralBundle\Twig\MyExtension
tags:
- { name: twig.extension }
arguments:
twig: "@twig"
所以本身的服务看起来像:
在services.yml<?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()函数的最佳方法是什么?
非常感谢!
你使用什么版本的symfony?在2.1我没有看到问题和这样的例子,因为你的工作没有问题。您可以尝试注入容器而不是twig_env和延迟加载树枝。 – l3l0
我正在使用版本2.1.8-DEV,但这个例子不起作用。我明白,注入整个容器是不好的做法,这就是为什么我走这条路......没有效果,因为有效地,树枝环境似乎是以某种方式“递归地注入”的。我在网上找不到任何文献以获得一个好的解决方案 – tchap
您是否尝试删除扩展的构造函数和服务文件中的参数部分? DIC应该照顾你。 –