2015-04-08 3 views
3

StackOverflow мой дом :-)Symfony2 Циклическая ссылка

Возможно у меня есть проблемы с петлей в шаблоне (или я идиот ;-)).

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> 

Когда я очистил кэш на 1 обновления в порядке, то есть ошибка:

Circular reference detected for service "templating", path: "templating -> twig -> twig_menu".

ответ

3

templating потребности twig , twig нуждается в twig_menu и twig_menutemplating. Следовательно, ваша круговая справочная проблема. Возможно, это потому, что вы находитесь в режиме dev, где Twig имеет гораздо больше зависимостей из-за профилировщика.

Fabien Potencier himself has answered this problem on GitHub, говоря: «Просто введите контейнер обслуживания и получите Twig от этого». Это быстрое и грязное решение, но оно должно работать без каких-либо серьезных санкций.

Но поскольку введение контейнера обслуживания является запахом кода, вы можете его избежать. Более глубокое (более правильное) решение заключается в рефакторе, так что twig не зависит от twig_menu, но, не зная всего вашего проекта, трудно сказать, как вы могли это сделать.

+0

Я не знаю, как это исправить. Я хотел бы создать «глобальную функцию», которая в аргументах имеет TYPE_ID и показывает это меню. '

'. Я не хочу «локально» на странице контроллера, создаю меню. Это глупо. – viko

+0

Похоже, вы хотите зарегистрировать функцию Twig, которая позволит вам сделать что-то вроде '{{show_menu (1)}}'. Кроме того, вы можете использовать прослушиватель, чтобы ваш шаблон имел что-то вроде '

', а затем слушатель получил всю отображаемую страницу и вводил HTML в этот div. Это примерно так, как добавляет панель веб-отладки - она ​​использует 'str_replace' для замены' 'на' '. –

+0

Да, функция Twig. Могу ли я использовать: '

', а также добавить/вставить код в меню? – viko

3

Внесите услугу веточки, а не службу шаблонов. @twig - это имя службы.

+0

Очень чистое решение, на мой взгляд, которое работало в проекте Symfony 2.5.0. – Ruben

0

Вместо того, чтобы вводить службу шаблонов в конструктор службы twig_menu, вы можете предоставить его с использованием метода setter. Например:

public function setTemplating(TwigEngine $templating) 
{ 
    $this->templating = $templating; 
} 

Затем в использовании контроллера:

$this->get('twig_menu')->setTemplating($this->get('templating')); 
Смежные вопросы