【问题标题】:How can i access repository functions in twig template in symfony2如何在 symfony2 的 twig 模板中访问存储库功能
【发布时间】:2012-08-01 06:58:35
【问题描述】:

我有class categroiesclass Products

在我的存储库中我有功能

getProducts($categoryid,$location)

我需要像这样在树枝模板中循环

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

或者有什么更好的方法

【问题讨论】:

  • 你试过 {% for item in product.items %} 吗?
  • 我认为你应该创建一个 Twig 扩展。看看this topic

标签: php symfony doctrine-orm twig


【解决方案1】:

你不应该。那是业务逻辑,不应出现在模板中。一种解决方案是在控制器和模板调用中创建新操作

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

【讨论】:

  • 或者我可以在控制器中制作像product[category][products] 这样的二维数组,然后在模板中发送该数组
  • @john110016 或者您在类别和产品实体之间创建 OneToMany-Relationship ;) for product in category.products。是的,有多种解决方案,但调用实体存储库不是其中之一。
  • 我已经有了onetomany 关系,但问题是如何应用位置过滤器,如果我这样做,它会显示所有产品
  • @john110016 好点。你可以试试Filter :) 应该看起来像for product in products|products_by_location(location) 或类似的东西。在使用 s2 in this articleofficial manual "How to write a custom Twig Extension" 时,您可以找到有关如何轻松实现它们的信息。
  • IIRC,渲染控制器会对性能产生不良影响。您能否确认它不会比将存储库传递给 Twig 模板慢?
【解决方案2】:

这是一个非常古老的问题,但我缺少像这样一个非常简单的解决方案。

可以将 repo 对象传递给 twig 并从 twig 调用 repo 公共方法,如下所示:

在你的控制器中

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

然后在你的树枝模板中:

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

我说这是可能的,许多人会认为模板应该只显示数据并让控制器收集数据。我个人不介意让我的模板自己获取数据。

【讨论】:

    【解决方案3】:

    我怀疑您真正需要的只是使用 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));
    

    这将为您提供给定位置的所有类别及其各自产品。

    【讨论】:

      【解决方案4】:

      解决方案与现在的做法相反。 Category 实体应该具有一对多的关系。看看http://symfony.com/doc/2.0/book/doctrine.html#entity-relationships-associations

      然后,类别实体应该有一个名为“产品”的 EntityCollection 属性。在您的模板中,您可以通过以下方式解决此问题:

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

      【讨论】:

        猜你喜欢
        • 2021-12-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-07-23
        • 1970-01-01
        相关资源
        最近更新 更多