Как украсить коллекцию доктрин - PullRequest
0 голосов
/ 27 ноября 2018

Я хочу украсить коллекцию 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 ;-)
    }
}

И вмой контроллер я загружаю полные записи из базы данных, используя:

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

И мой взгляд прост:

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

Итак, теперь я хочу украсить всю коллекцию.

В SF4 я нашел Как украсить услуги , который выглядит хорошо, но в этой ситуации это не работает.

Потому что: доктрина возвращаетНеизменяемая коллекция (см. эту тему Неизменяемые коллекции в 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 голосов
/ 27 ноября 2018

Если вы хотите «преобразовать» данные в шаблоне ветки, предложите использовать TwigExtension и создать пользовательский фильтр (или функцию).

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

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