Symfony2循环参考

时间:2015-04-08 16:31:49

标签: symfony

我的模板循环可能有问题。

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;

3 个答案:

答案 0 :(得分:3)

templating需要twigtwig需要twig_menutwig_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'));