【问题标题】:Howto decorate doctrine collection如何装饰学说收藏
【发布时间】:2019-04-29 06:12:15
【问题描述】:

我想装饰一个教义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 看起来不错,但这不适用于这种情况。

因为:学说返回一个不可变的集合(请参阅此主题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);

【问题讨论】:

    标签: php symfony doctrine decorator symfony4


    【解决方案1】:

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

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

    【讨论】:

    • 这是个好主意,但它只适用于Twig。如果我想使用另一个模板引擎或构建一个 json 响应,那么这将不起作用。我正在寻找一种将装饰器“注入”到教义中的解决方案,例如
    猜你喜欢
    • 2018-09-29
    • 2014-07-19
    • 1970-01-01
    • 2018-10-09
    • 1970-01-01
    • 2016-09-04
    • 2017-11-24
    • 2023-02-24
    • 1970-01-01
    相关资源
    最近更新 更多