在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應該照顧你。 –