Добавление данных в возвращенные объекты в Symfony - PullRequest
0 голосов
/ 07 февраля 2020

Вопрос действительно относится к лучшей практике и возможно ли то, что у меня в голове. Я запрашиваю коллекцию сущностей-членов, используя функцию репозитория, например (упрощенно)

    /**
     * @return Query
     */
    public function findAllMembersOrderedByNameResult()
    {
        return $this->createQueryBuilder('m')
            ->orderBy('m.lastName', 'ASC')
            ->getQuery()
            ->getResult()
            ;
    }

Я вызываю это в моем контроллере:

$members = $em->getRepository(Member::class)->findAllMembersOrderedByNameResult();

Теперь я передаю приведите это к моему файлу шаблона ветки и смогу l oop через это и отобразить информацию о каждом члене как часть foreach l oop:

{% for member in members %}
{{member.firstName}}
{% endfor %}

Это, очевидно, работает нормально, однако у меня есть потребность Теперь добавим некоторые дополнительные данные каждому члену для передачи в шаблон веточки. Так, например, используя DateOfBirth в сущности Member, я хочу выполнить это через функцию, чтобы определить возраст члена для отображения в шаблоне Twig. Поэтому в данный момент я выполняю этот вызов в Controller, а затем передаю его в шаблон, создавая MembersArray, перебирая возвращенную коллекцию $ members и добавляя результат new age и целый Member в виде двух отдельных значений в массив, например:

foreach($members as $member)
{ 
  $membersArray[] = array(
  'member' => $member,
  'age' => $age
  )
}

Это работает, однако в моем шаблоне Twig мне теперь нужно использовать

{% for member in membersArray %}
{{member.member.firstName}}
{{member.age}
{% endfor %}

Было бы гораздо приятнее просто добавить age в коллекцию без создания массива, поэтому я могу просто использовать member.firstName и member.age, но для жизни не могу найти способ, как без необходимости l oop вручную просматривать все значения и устанавливать их в новый массив, который кажется огромной тратой кода.

Я хочу добавить больше, чем просто возраст, это просто упрощенный пример. Использование Symfony 4.4 и PHP 7.3 в случае, если это требуется для всего, что требуется:


Редактировать: Структура объекта в соответствии с запросом (сокращение):

namespace App\Entity;

use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity(repositoryClass="App\Repository\MemberRepository")
 */
class Member
{
    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    private $id;

    /**
     * @ORM\Column(type="string", length=255, nullable=true)
     */
    private $firstName;

    /**
     * @ORM\Column(type="date", nullable=true)
     */
    private $dateOfBirth;

 ...

1 Ответ

1 голос
/ 07 февраля 2020
  1. Простейшим способом будет добавление пользовательских методов получения к самой сущности , например:

    public function getAge()
    {
        return (new DateTime())->diff($this->dateOfBirth)->y;
    }
    

    Затем вы можете рассчитать возраст в шаблоне веточки позвонив member.age.

    Но обычно не рекомендуется иметь лог c в самой сущности.

  2. Другой способ - использование самой ветки для форматирования данных . Я бы сказал, что это предпочтительнее с примером возраста. Поскольку возраст больше похож на формат представления поля dataOfBirth, чем на дополнительные данные, для его вычисления можно использовать фильтр веток. Встроенный, как {{ date().diff(member.dateOfBirgth)).format('%y') }}, или определить пользовательский с расширение ветки , так что синтаксис будет более простым, как {{ member.dateOfBirgth|age }} или даже {{ member|age }}.

  3. Если вам нужно повторно использовать форматирование не только в ветке, но и в некоторых службах, и вы не хотите помещать logi c в сущность - вы можете отделить расширение ветки от В предыдущем примере используйте общую службу, которая отвечает за форматирование возраста . Другие части системы могут использовать ту же службу форматирования.

  4. Кроме того, обычной практикой является использование новых методов для работы с сущностью для пользовательского диспетчера сущностей сервис, как MemberManager. Обычно мы используем менеджер сущностей для управления сущностями, но вы можете добавить туда метод для форматирования age, например MemberManager->getAge($member). Это нарушило бы принцип единственной ответственности, поэтому я не могу его рекомендовать.

  5. Если вы ищете расширение doctrine сущностей с некоторыми дополнительными методами для слушателей или так, это невозможно по doctrine дизайну. В любом случае, это самый, неочевидный способ.

Подводя итог, в большинстве случаев, когда пользовательскую функцию можно рассматривать как функцию форматирования, я бы рекомендовал использовать второй вариант, с развязывать его с третьим вариантом всякий раз, когда вам нужно повторно использовать код форматирования. Но если проект не сложный, стоит проверить и первый вариант, так как он самый простой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...