metadata = $metadata; $this->injectableFactory = $injectableFactory; $this->template = $template; $this->engine = $engine; } public function printEntity(Entity $entity, ?Params $params, ?Data $data = null): Contents { $params = $params ?? new Params(); $data = $data ?? new Data(); return $this->createPrinter('entity')->print($this->template, $entity, $params, $data); } public function printCollection(Collection $collection, ?Params $params, ?IdDataMap $IdDataMap = null): Contents { $params = $params ?? new Params(); $IdDataMap = $IdDataMap ?? new IdDataMap(); return $this->createPrinter('collection')->print($this->template, $collection, $params, $IdDataMap); } private function createPrinter(string $type): object { $className = $this->metadata ->get(['app', 'pdfEngines', $this->engine, 'implementationClassNameMap', $type]) ?? null; if (!$className) { throw new Error("Unknown PDF engine '{$this->engine}', type '{$type}'."); } return $this->injectableFactory->create($className); } }