diff --git a/src/ModelGenerator.php b/src/ModelGenerator.php index 528cd95a13168f9b5b99475c8b88ed59d01ed629..be77d09e249a67d89cb1905fd6ffc910e7a9ba46 100644 --- a/src/ModelGenerator.php +++ b/src/ModelGenerator.php @@ -22,7 +22,6 @@ namespace Irstea\NgModelGeneratorBundle; use ApiPlatform\Core\Documentation\Documentation; use Irstea\NgModelGeneratorBundle\Exceptions\DomainException; use Irstea\NgModelGeneratorBundle\Exceptions\Exception; -use Irstea\NgModelGeneratorBundle\Exceptions\TypeError; use Irstea\NgModelGeneratorBundle\Iterators\IteratorBuilder; use Irstea\NgModelGeneratorBundle\Metadata\MetadataFactoryInterface; use Irstea\NgModelGeneratorBundle\Metadata\ResourceMetadata; @@ -261,24 +260,25 @@ final class ModelGenerator { $repositories = []; - /** - * @var ClassName - * @var ResourceMetadata $resourceMeta - */ + // Premier passage pour prégénérer des référénces aux ressources + foreach ($this->getResourceMetadata() as $class => $resourceMeta) { + /* @var ClassName $class */ + /* @var ResourceMetadata $resourceMeta */ + $ref = $this->typeFactory->defer($class->getFullName()); + $this->typeFactory->add($resourceMeta->getBaseName(), $ref); + } + + // Maintenant on génére les repositories foreach ($this->getResourceMetadata() as $class => $resourceMeta) { + /* @var ClassName $class */ + /* @var ResourceMetadata $resourceMeta */ try { $repo = $this->buildRepositories($resourceMeta); - if (!$repo) { - continue; + if ($repo) { + $repositories[$repo->getName()] = $repo; } - $repositories[$repo->getName()] = $this->typeFactory->getOrCreate( - $repo->getName(), - function () use ($repo): Type { - return $repo; - } - )->getAsType(Repository::class); } catch (Exception $ex) { - printf("/* Erreur pendant le mapping de %s:\n * %s */\n", $class, $ex->getMessage()); + printf("Erreur pendant le mapping de %s: %s\n", $class, $ex->getMessage()); } } @@ -290,38 +290,42 @@ final class ModelGenerator /** * @param ResourceMetadata $resourceMeta * - * @return Repository`null + * @return Repository|null */ private function buildRepositories(ResourceMetadata $resourceMeta): ?Repository { - $operations = []; - $iri = null; - $defaultNormalization = $resourceMeta->getDefaultNormalization(); + $defaultNormalizationMapper = $this->serializationMapperFactory->create($defaultNormalization, true); + /** + * @var Type + * @var Property $identifier + * @var Property[] $properties + */ [$defaultRepr, $identifier, $properties] = $defaultNormalizationMapper->getResourceData(); if (!$properties) { - throw new TypeError( - sprintf( - 'No property found for %s (groups: [%s])', - $resourceMeta->getBaseName(), - implode(', ', $defaultNormalization->getGroups()) - ) + printf( + "No property found for %s (groups: [%s])\n", + $resourceMeta->getBaseName(), + implode(', ', $defaultNormalization->getGroups()) ); + + return null; } if (!$identifier) { - throw new TypeError( - sprintf( - 'No identifier found for %s (groups: [%s])', + printf( + "No identifier found for %s (groups: [%s])\n", $resourceMeta->getBaseName(), implode(', ', $defaultNormalization->getGroups()) - ) - ); + ); + + return null; } + $operations = []; $pathParser = new PathParser($resourceMeta, $properties); foreach ($resourceMeta->getOperations() as $operation) {