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