Я начинаю с 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 (слой инфраструктуры)