如何装饰学说集

时间:2018-11-27 13:25:28

标签: php symfony doctrine decorator symfony4

我想装饰一个doctrine2集合并使用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 ;-)
    }
}

然后在我的Controller中,使用以下命令从数据库加载完整的条目:

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

我的观点很简单:

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

所以,现在我要装饰整个收藏集。

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

原因是:该学说返回一个不变的集合(请参见Immutable collections in 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);

1 个答案:

答案 0 :(得分:1)

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

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

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