Как я могу получить доступ к функциям репозитория в шаблоне twig в symfony2

У меня есть class categroies и class Products .

В моем хранилище у меня есть функция

getProducts($categoryid,$location)

Мне нужно, чтобы петля в шаблон

  {% for category in categories %} --{{ category.name }}-- {% for product in getProducts(category.id,location) %} --{{ product.name }}-- {% endfor %} {% endfor %} 

или есть лучший способ для этого

Вы не должны. То бизнес-логика, которая не должна появляться в шаблонах. Одним из решений является создание нового действия в контроллере и в вызове шаблона

 {% render '@MyBundle:Product:list' with {category: category.id} %} 

Это довольно старый вопрос, но у меня отсутствует очень простое решение, подобное этому.

Можно передать объект репо на веточку и вызвать публичные методы репо из ветки так:

В вашем контроллере

 $oCatRepo = $this->getDoctrine()->getManager()->getRepository('AppBundle:Categories'); .... return $this->render('product_list.html.twig', array('oCatRepo' => $oCatRepo)); 

И затем в вашем шаблоне ветки:

 {{ oCatRepo.getProducts(category.id, location) }} 

Я говорю, что это возможно, многие утверждают, что шаблоны должны отображать только данные и позволяют контроллерам собирать данные. Я лично не против позволять своим шаблонам самим получать свои данные.

Я подозреваю, что все, что вам действительно нужно, – это левое соединение, использующее выражение WITH. Что-то вроде:

 class CategoryManager { public function loadCategoriesProductsForLocation($location) { $qb = $this->em->->createQueryBuilder(); $qb->addSelect('category'); $qb->addSelect('product'); $qb->from('MyBundleBundle:Category','category'); $qb->leftJoin('category.products','product', Expr\Join::WITH, $qb->expr()->eq('product.location', $location)); 

Это даст вам все категории с соответствующими продуктами для определенного места.

Решение является другим способом, как это делается прямо сейчас. Объект Category должен иметь отношение «один ко многим». Взгляните на http://symfony.com/doc/2.0/book/doctrine.html#entity-relationships-associations

Тогда в категории Entity должен быть атрибут EntityCollection, называемый «продуктом». В вашем шаблоне вы можете решить эту проблему следующим образом:

 {% for category in categories %} --{{ category.name }}-- {% for product in category.products %} --{{ product.name }}-- {% endfor %} {% endfor %}