DDD Значения объектов и сущностей без сопоставления ORM в PHP - PullRequest
0 голосов
/ 05 марта 2020

Во-первых, как я знаю, Entity в DDD почти совпадает с Value Object, за исключением того, что Entity имеет идентичность. В каждой статье, которую я прочитал, говорится, что идентификатор сущности имеет ORM-сопоставление с любым инструментом ORM. Но я не хочу использовать ORM-отображение в Entity. Вместо этого я хотел бы выполнять операции базы данных с интерфейсами репозитория без сопоставления. И, в этом случае, я застрял на том, как я должен это сделать.

Я объясню в своем уме с примером ниже

Давайте предположим, что у меня есть приложение TODO и есть некоторые вопросы в TODO и некоторые ответы в каждом из этих вопросов.

У нас есть 3 объекта значения (или объекта): Todo TodoQuestion TodoQuestionValue

Теперь я подумал, что у меня есть объект значения (или объект) для ТОДО. Этот объект значения имеет метод для получения вопросов, который получает массив объекта значения TodoQuestion. А внутри объекта значения TodoQuestion у нас есть метод для получения значений вопросов, который получает массив TodoQuestionValue.

<?php
class Todo{
   private int $id;
   /**
    * @param array<TodoQuestion> $questions
    */
   private array $questions;
   private TodoRepositoryInterface $repository;
   public function __constructor(TodoRepositoryInterface $repository){
      $this->repository = $repository;
   }
   public function getQuestions(){
      $this->questions = $this->repository->listQuestionsByTodoId($this->id);
   }
}
<?php
class TodoQuestion{
   private int $id;
   private string $question;
   /**
    * @param array<TodoQuestionValue> $values
    */
   private array $values;
   private TodoRepositoryInterface $repository;
   public function __constructor(TodoRepositoryInterface $repository){
      $this->repository = $repository;
   }
   public function getValues(){
      $this->values = $this->repository->listValuesByQuestionId($this->id);
   }
}

Теперь я хотел бы узнать ваше мнение о том, как я мог бы сформировать эту структуру с помощью следуя правилам DDD.

Спасибо.

1 Ответ

0 голосов
/ 05 марта 2020

Давайте предположим, что у меня есть приложение TODO, и в TODO есть несколько вопросов и ответы на каждый из них.

Вам просто нужно перевести это в код. Единственная сущность здесь - Тодо. Сделайте его совокупным root и создайте для него хранилище.

<?php

class Todo
{
    private int $id;
    /**
     * @param array<TodoQuestion> $questions
     */
    private array $questions;

    public function getQuestions()
    {
        return $this->questions;
    }
}

На вопрос есть ответы. Вы можете смоделировать это с двумя объектами значения: Вопрос и Ответ.

<?php

class TodoQuestion
{
    private string $question;
    private array $values;
    /**
     * @var TodoAnswer[]
     */
    private array $answers;

    public function getValues()
    {
        return $this->values;
    }

    public function getAnswers(): array
    {
        return $this->answers;
    }
}

Ваша модель никогда не должна зависеть от хранилища. Задача хранилища состоит в том, чтобы сохранить состояние агрегата и восстановить его, когда вы запрашиваете агрегат.

interface TodoRepository {
    public function save(Todo $todo): void;

    public function todoOfId(TodoId $id): Todo;
}

Вам не нужно больше, чем эти 2 метода. Если вы хотите получить список вопросов для одного Todo, вы просто получите агрегат Todo root и затем позвоните ->getQuestions(). В своей реализации репозитория вы можете решить использовать orm, писать необработанные запросы, сериализовать агрегат и затем сохранять его ... Возможности бесконечны, просто убедитесь, что ваша модель не связана с этими проблемами инфраструктуры.

...