Геттер для объекта из JSON-Field - PullRequest
0 голосов
/ 07 декабря 2018

У меня есть 2 сущности:

class Opponent
{
  ...
  ...
  ...
}

class Process 
{

    /**
     * @var array
     * 
     * @ORM\Column(name="answers_in_related_questionnaires", type="json", nullable=true)
     */
    private $answersInRelatedQuestionnaires = [];

    .
    .        
    . 

}

У меня есть в поле answersInRelatedQuestionnaires среди прочего объект-противник

"opponent": {
 "id":1088,
 "name":"Inora Life Versicherung"
}

Я хочу написать геттер в процессе сущности, которыйполучает не только оба значения id и name от оппонента, но и весь объект Opponent.Примерно так:

private function getOpponent() : Opponent
{
    $id = $this->answersInRelatedQuestionnaires['opponent']['id'];
    return $entityManager->getRepository(Opponent::class)->find($id)
}

Я читал, что использование менеджера сущностей внутри сущности не очень хорошая идея.Какие решения для моей проблемы есть?Можно ли использовать репозиторий Process в сущности Process?

1 Ответ

0 голосов
/ 07 декабря 2018

Вы не должны внедрять менеджер сущностей в сущность, это очень плохая практика и нарушает разделение интересов между классами.НО, если вы действительно хотите, вы действительно можете внедрить менеджера сущностей в вашу сущность.

ХОРОШАЯ ПРАКТИКА:

Создайте класс Model/Process и включите в него все функции, которые касаются вашегомодель.Учебные сущности не являются модельными классами.В Model/Process вы можете внедрить менеджер сущностей и любую другую нужную вам службу.

EDIT : Создавая класс Model/Process, я имею в виду создание класса с именем Process внутри Model каталог в вашей папке /src.Ваш путь вашего класса будет: /src/Model/Process.Конечно, имя каталога или класса может быть любым, но это типичное соглашение.Ваш класс Model должен отвечать за всю вашу бизнес-логику, такую ​​как проверка вашей модели и т. Д. Это действительно усложнит структуру вашего кода, но в долгосрочной перспективе будет полезным для крупномасштабных проектов.Вам также понадобится Model/ProcessManager для правильного заполнения модели процесса в различных случаях (например, при загрузке из базы данных, пользовательской формы и т. Д.). Конечно, в конечном итоге все зависит от сложности и устойчивости.

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

АЛЬТЕРНАТИВЫ:

Если вы обращаетесь к атрибуту opponent только после загрузки объекта, вы можете использовать Doctrine PostLoad LifecycleCallback для правильной установки атрибута opponent.Это не плохая практика:

use Doctrine\Common\Persistence\Event\LifecycleEventArgs;

/**
 * @ORM\Entity()
 * @ORM\HasLifecycleCallbacks()
 */
class Product
{
    // ...
    private $opponentObject;

    /**
     * @ORM\PostLoad
     */
     public function onPostLoad(LifecycleEventArgs $args){
         $em = $args->getEntityManager();

         $id = $this->answersInRelatedQuestionnaires['opponent']['id'];
         $this->opponentObject = $em->getRepository(Opponent::class)->find($id);

     }

     public function getOpponent() {
         return $this->opponent;

     }
} 

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

use Doctrine\ORM\EntityManagerInterface;

class Process
{
    private $em;

    public function __contruct(EntityManagerInterface $em)
    {
        $this->em = $em;
    }
    ....
}
...