Сопоставление пользовательских коллекций с Doctrine (DDD) - PullRequest
0 голосов
/ 19 апреля 2020

Я начинаю с DDD и пытаюсь разработать API с Symfony. Everythong работает нормально, но я видел, что моя модель не агности c до Doctrine из-за пользовательских коллекций. Вот пример: во-первых, рабочая модель:

class Work extends Entity
{
    private ?string $company;
    private ?string $position;
    private ?HighlightCollection $highlights;
    public function __construct(
        ?WorkId $id,
        ?string $company,
        ?string $position,
        ?HighlightCollection $highlights = null
    )
    {
        $this->setid($id === null ? new WorkId() : $id);
        $this->company = $company;
        $this->position = $position;
        $this->highlights = $highlights;
        parent::__construct();
    }

    public function company(): ?string
    {
        return $this->company;
    }

    public function position(): ?string
    {
        return $this->position;
    }

    public function highlights(): ?HighlightCollection
    {
        return $this->highlights;
    }
}

HighlightCollection распространяется от пользовательского и общего класса абстрактных коллекций в домене:

class HighlightCollection extends Collection
{
    protected function validateAdd($object)
    {
        if (!$object instanceof Highlight) {
            throw new HighlightCollectionBadItemException();
        }
    }

    protected function validateRemove($key)
    {
        if (!isset($this->collection[$key])) {
            throw new HighlightCollectionBadItemException();
        }
    }

}

А вот yml сопоставления doctrine для модели Work:

BlaBlaBla\Domain\Model\Work\Work:
  type: entity
  table: 'work'
  id:
    id:
      type: WorkId
      primary: true
  fields:
    company:
      type: string
      length: 100
      nullable: true
    position:
      type: string
      length: 100
      nullable: true
  oneToMany:
    highlights:
      targetEntity: BlaBlaBla\Domain\Model\Work\Highlight
      mappedBy: work
      joinColumn:
        name:  id
        referencedColumnName: work_id

А вот yml-отображение doctrine для модели Highlight:

BlaBlaBla\Domain\Model\Work\Highlight:
  type: entity
  table: 'work_highlight'
  id:
    id:
      type: WorkHighlightId
      primary: true
  fields:
    highlight:
      type: string
      length: 100
      nullable: true
  manyToOne:
    work:
      targetEntity: Blablabla\Domain\Model\Work\Work
      inversedBy: highlights
      cascade: ["all"]
      joinColumn:
        name: work_id
        referencedColumnName: id

Когда я получаю Work из базы данных, метод подсветки возвращает PersistentCollection из Doctrine. Как я могу сопоставить Doctrine Collection с моими собственными коллекциями ?. Важно: Мои пользовательские коллекции находятся в домене, поэтому не хотят знать Doctrine (слой инфраструктуры)

...