Php 什么更有效:用细枝过滤器填充变量,还是将它们传递给控制器?

Php 什么更有效:用细枝过滤器填充变量,还是将它们传递给控制器?,php,symfony,controller,twig,twig-filter,Php,Symfony,Controller,Twig,Twig Filter,我最近一直在使用自己定制的树枝过滤器。我也一直在寻找提高我表现的方法 我很难区分什么时候应该在服务中构建一个函数,然后由一个控制器使用,还是应该将它改为一个细枝过滤器。我想知道哪一个执行得更快,或者是否有任何区别?为了澄清我的问题,我想展示一下我是如何用这两种方法填充可变照片的 细枝模板将如下所示。它将只使用照片阵列生成图像元素 /content/photos.html.twig {% for photo in photos %} <img class="lozad car

我最近一直在使用自己定制的树枝过滤器。我也一直在寻找提高我表现的方法

我很难区分什么时候应该在服务中构建一个函数,然后由一个控制器使用,还是应该将它改为一个细枝过滤器。我想知道哪一个执行得更快,或者是否有任何区别?为了澄清我的问题,我想展示一下我是如何用这两种方法填充可变照片的

细枝模板将如下所示。它将只使用照片阵列生成图像元素

/content/photos.html.twig

    {% for photo in photos %}
    <img class="lozad card-img read-more-card-item-img" data-src="{{ photo }}">  
    {% endfor %}
方法2:改用自定义细枝过滤器:

public function getFilters()
 {
return array (new \Twig\TwigFilter('readMorePhotos', array($this, 'getReadMorePhotos')));
}

 //Twig filter
    public function getReadMorePhotos($posts)
    {
...
        $photos = [];
        foreach ($posts as $post) {
             $image = $this->getAbsoluteThumbsPath($post->getImage());
             if ($image != null && $image != "" && strpos($image, '/img/posts/default-post.png') === false) {
                  $gallery[] = $image;
             }
        }
...
        return $photos;
    }
在细枝模板中,photos变量将按如下方式填充:

{{set photos = posts|readMorePhotos}}

这两种方法有什么不同吗?

非常固执己见,所以这个答案本质上。。。这是一种观点

在我看来:模板中使用的非标准函数/过滤器越多,语义上的问题就越严重。一方面,任何编辑或创建模板的人都必须知道这些函数/过滤器,在我看来,这是不可取的

此外,正如问题的评论中已经提到的那样,过滤器用于转换数据,而不是获取数据。twig函数更合适,但我也不喜欢它,因为上面的原因(它还向该函数公开所有模板,除非采取预防措施,另一方面,它应该存在于所有模板中)

另一方面,模板编辑器/创建者还必须知道当前上下文中可能存在哪些变量。因此,最终需要一些先验知识

我想提出一个稍微不同的选择(在我傲慢但谦逊的观点中也是更好的选择)

就我看来,如果你能用

 {% for photo in post.photos %}
       {# display of photos #}
 {% endfor %}
因为它们在语义上与post相关,而且假设它们在结构上也相关也是有意义的。由于您的用例看起来有点不同,它可能是:

 {% for photo in posts.photos %}
当然,它有不同的语义,并且真正与
posts
作为一个数组有关,其中
photos
是一个元素。然而,想象集合是一个具有额外功能的对象(我会无耻地扩展教义):

然后可以如上所述使用

为什么这样做有效?实现几个接口,其中有以及(扩展),允许您在循环中使用它,它将提供在其构造函数中提供的集合(或在修改方法中更改的集合),如果需要,您始终可以通过
ArrayCollection::toArray
检索数组

为什么要这样做?获取干净的代码


我要这样做吗?不,待定。但这部分是因为我习惯于实现数据库中几乎所有的关系,这与ORM结合在一起可以免费提供一些关系。

过滤器应用于转换数据,而不是获取imho。无论如何,这个问题是非常基于意见的,因此离题SO@DarkBee谢谢我想这已经回答了我的问题。我需要明确区分我的项目中的细枝过滤器和服务的作用。我认为你的方法是最好的。我应该只在转换数据时使用细枝过滤器
 {% for photo in posts.photos %}
 <?php

 namespace App\Collection;

 use Doctrine\Common\Collections\ArrayCollection;
 use App\Service\PhotoService;

 class PostCollection extends ArrayCollection {
     public $photoService;

     public function __construct(array $elements, PhotoService $photoService) {
         parent::__construct($elements);
         $this->photoService = $photoService;
     }

     public function getPhotos() {
         return $this->photoService->getReadMorePhotos($this->toArray())
     }
 }
$response = $this->render(
    '/content/photos.html.twig',
    array(
        'posts' => new PostCollection($posts, $photoService),
        'loadMoreUrl' => $url,
        'limit' => $limit
    )
);