首页 > 解决方案 > 如何装饰学说收藏

问题描述

我想装饰一个教义2集合并使用symfony4。

所以我有一个实体

class Entry
{
    protected $title;

    public function getTitle(): ?string
    {
        return $this->title;
    }
}

还有一个装饰器:

class EntryDecorator
{
    protected $entry;

    public function __construct(Entry $entry)
    {
        $this->entry = $entry;
    }

    public function getTitle()
    {
        return '----'; // just for testing ;-)
    }
}

在我的控制器中,我使用以下方法从数据库中加载完整条目:

$entries = $this->entryRepository->findAll()

我的观点很简单:

{% for entry in entries  %}
    {{ entry.getTitle }}
{% endfor %}

所以,现在我想装饰整个系列。

在 SF4 中,我发现How to Decorate Services看起来不错,但这不适用于这种情况。

因为: doctrine 返回一个不可变集合(请参阅Doctrine 2 中的这个主题不可变集合?

所以我认为这样的事情会很好:

array_walk($entries, function($entry) {
    return new EntryDecorator($entry);
});

但不起作用,因为集合是不可变的。

现在我有以下工作:

$entries = [];

foreach($this->entryRepository->findAll() as $entry) {
    $entries[] = new EntryDecorator($entry);
}

但它看起来嗯,好的。

所以我的问题是:装饰学说收藏有更好的解决方案吗?

更新: 目前,我正在array_map()为此使用。

array_map(function ($entry) {
    $decorator = new EntryDecorator($entry);

    return $decorator;
}, $entries);

标签: phpsymfonydoctrinedecoratorsymfony4

解决方案


如果您想“转换”树枝模板中的数据,建议您使用TwigExtension并创建自定义过滤器(或函数)。

{# filter #}
{% for entry in entries  %}
    {{ entry.getTitle|my_decorator }}
{% endfor %}

{# function #}
{% for entry in entries  %}
    {{ my_decorator(entry) }}
{% endfor %}

推荐阅读