elementsById) + 1; $element = new Element( id: $id, title: $dto->title, description: $dto->description, richText: $dto->richText, pdfPath: $dto->pdfPath, set: $dto->set, parentElement: $dto->parentElement, ); $this->elementsById[$id] = $element; return $element; } public function find(int $id): ?Element { if (! isset($this->elementsById[$id])) { return null; } return $this->cloneElement($this->elementsById[$id]); } public function findRootBySet(DomainSet $set): ?Element { foreach ($this->elementsById as $element) { if ( $element->getSet()->getId() === $set->getId() && $element->getParentElement() === null ) { return $this->cloneElement($element); } } return null; } /** * @return Element[] */ public function findBySet(DomainSet $set): array { $elements = []; foreach ($this->elementsById as $element) { if ($element->getSet()->getId() === $set->getId()) { $elements[] = $this->cloneElement($element); } } return $elements; } /** * @return Element[] */ public function findByParentElement(Element $parentElement): array { $elements = []; foreach ($this->elementsById as $element) { $currentParentElement = $element->getParentElement(); if ( $currentParentElement !== null && $currentParentElement->getId() === $parentElement->getId() ) { $elements[] = $this->cloneElement($element); } } return $elements; } private function cloneElement(Element $element): Element { $parentElement = $element->getParentElement(); if ($parentElement !== null) { $parentElement = $this->cloneElement($parentElement); } return new Element( id: $element->getId(), title: $element->getTitle(), description: $element->getDescription(), richText: $element->getRichText(), pdfPath: $element->getPdfPath(), set: $element->getSet(), parentElement: $parentElement, ); } }