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






Если вы хотите «преобразовать» данные в вашем шаблоне веточки, если вы предлагаете вам использовать TwigExtension и создать собственный фильтр (или функцию).
{# filter #}
{% for entry in entries %}
{{ entry.getTitle|my_decorator }}
{% endfor %}
{# function #}
{% for entry in entries %}
{{ my_decorator(entry) }}
{% endfor %}
Это хорошая идея, но работает только для
Twig. Если я хочу использовать другой шаблонизатор или создать ответ json, это не сработает. я ищу решение, чтобы «вставить» декоратор в доктрину, например