contextManager = $contextManager; $this->driver = $driver; $this->entityManager = $entityManager; $this->logger = $logger; $this->storedObjectManager = $storedObjectManager; } /** * @template T of File|null * @template B of bool * @param B $isTest * @param (B is true ? T : null) $testFile * @psalm-return (B is true ? string : null) * @throws \Symfony\Component\Serializer\Exception\ExceptionInterface|\Throwable */ public function generateDocFromTemplate( DocGeneratorTemplate $template, int $entityId, array $contextGenerationDataNormalized, ?StoredObject $destinationStoredObject = null, bool $isTest = false, ?File $testFile = null, ?User $creator = null ): ?string { if ($destinationStoredObject instanceof StoredObject && StoredObject::STATUS_PENDING !== $destinationStoredObject->getStatus()) { $this->logger->info(self::LOG_PREFIX.'Aborting generation of an already generated document'); throw new ObjectReadyException(); } $this->logger->info(self::LOG_PREFIX.'Starting generation of a document', [ 'entity_id' => $entityId, 'destination_stored_object' => $destinationStoredObject === null ? null : $destinationStoredObject->getId() ]); $context = $this->contextManager->getContextByDocGeneratorTemplate($template); $entity = $this ->entityManager ->find($context->getEntityClass(), $entityId) ; if (null === $entity) { throw new RelatedEntityNotFoundException($template->getEntity(), $entityId); } $contextGenerationDataNormalized = array_merge( $contextGenerationDataNormalized, ['creator' => $creator], $context instanceof DocGeneratorContextWithPublicFormInterface ? $context->contextGenerationDataDenormalize($template, $entity, $contextGenerationDataNormalized) : [] ); $data = $context->getData($template, $entity, $contextGenerationDataNormalized); $destinationStoredObjectId = $destinationStoredObject instanceof StoredObject ? $destinationStoredObject->getId() : null; $this->entityManager->clear(); gc_collect_cycles(); if (null !== $destinationStoredObjectId) { $destinationStoredObject = $this->entityManager->find(StoredObject::class, $destinationStoredObjectId); } if ($isTest && ($testFile instanceof File)) { $templateDecrypted = file_get_contents($testFile->getPathname()); } else { $templateDecrypted = $this->storedObjectManager->read($template->getFile()); } try { $generatedResource = $this ->driver ->generateFromString( $templateDecrypted, $template->getFile()->getType(), $data, $template->getFile()->getFilename() ); } catch (TemplateException $e) { throw new GeneratorException($e->getErrors(), $e); } if (true === $isTest) { $this->logger->info(self::LOG_PREFIX.'Finished generation of a document', [ 'is_test' => true, 'entity_id' => $entityId, 'destination_stored_object' => $destinationStoredObject === null ? null : $destinationStoredObject->getId() ]); return $generatedResource; } /** @var StoredObject $destinationStoredObject */ $destinationStoredObject ->setType($template->getFile()->getType()) ->setFilename(sprintf('%s_odt', uniqid('doc_', true))) ->setStatus(StoredObject::STATUS_READY) ; $this->storedObjectManager->write($destinationStoredObject, $generatedResource); $this->entityManager->flush(); $this->logger->info(self::LOG_PREFIX.'Finished generation of a document', [ 'entity_id' => $entityId, 'destination_stored_object' => $destinationStoredObject->getId(), ]); return null; } }