我的模板循环可能有问题。
services:
twig_menu:
class: Cms\PageBundle\Twig\Menu
arguments: ['@doctrine.orm.entity_manager', "@templating"]
代码php:
namespace Cms\PageBundle\Twig;
use Doctrine\ORM\EntityManager;
use Symfony\Component\Templating\EngineInterface;
class Menu {
protected $em, $templating;
public function __construct(EntityManager $em, EngineInterface $templating){
$this->em = $em;
$this->templating=$templating;
}
public function show($typ){
$menu=$this->em->getRepository("CmsAdminBundle:Menu")->findBy(array('type_id'=>$typ));
return $this->templating->render("menu.html.twig", array('links'=>$menu));
}
}
模板:
<ul>
{% for link in links %}
<li><a href="{{ link.href }}">{{ link.name }}</a></li>
{% endfor %}
</ul>
当我在第一次刷新时清除缓存时没关系,接下来我收到此错误:
检测到服务的循环引用&#34;模板&#34;,路径: &#34;模板 - &gt;树枝 - &gt; twig_menu&#34;
答案 0 :(得分:3)
templating
需要twig
,twig
需要twig_menu
,twig_menu
需要templating
。因此你的循环参考问题。这可能是因为你处于开发模式,因为有了分析器,Twig有更多的依赖关系。
Fabien Potencier himself has answered this problem on GitHub说&#34;只需注入服务容器并从中获取Twig&#34;。这是一个快速而肮脏的解决方案,但它应该没有任何严重的惩罚。
但是因为注入服务容器是一种代码味道,你可能想避免它。更深层次(更正确)的解决方案是重构,以便twig
不依赖于twig_menu
,但如果不了解整个项目,很难说你如何做到这一点
答案 1 :(得分:3)
注入树枝服务,而不是模板服务。 @twig是服务名称。
答案 2 :(得分:0)
您可以使用setter方法提供模板服务,而不是在twig_menu
服务的构造函数中注入模板服务。例如:
public function setTemplating(TwigEngine $templating)
{
$this->templating = $templating;
}
然后在您的控制器中使用:
$this->get('twig_menu')->setTemplating($this->get('templating'));