describers = $describers; $this->modelDescribers = $modelDescribers; $this->cacheItemPool = $cacheItemPool; $this->cacheItemId = $cacheItemId; $this->generator = $generator ?? new Generator($this->logger); } public function setAlternativeNames(array $alternativeNames) { $this->alternativeNames = $alternativeNames; } public function setMediaTypes(array $mediaTypes) { $this->mediaTypes = $mediaTypes; } public function setOpenApiVersion(?string $openApiVersion) { $this->openApiVersion = $openApiVersion; } public function generate(): OpenApi { if (null !== $this->openApi) { return $this->openApi; } if ($this->cacheItemPool) { $item = $this->cacheItemPool->getItem($this->cacheItemId ?? 'openapi_doc'); if ($item->isHit()) { return $this->openApi = $item->get(); } } if ($this->openApiVersion) { $this->generator->setVersion($this->openApiVersion); } $this->generator->setProcessors($this->getProcessors($this->generator)); $context = Util::createContext(['version' => $this->generator->getVersion()]); $this->openApi = new OpenApi(['_context' => $context]); $modelRegistry = new ModelRegistry($this->modelDescribers, $this->openApi, $this->alternativeNames); if (null !== $this->logger) { $modelRegistry->setLogger($this->logger); } foreach ($this->describers as $describer) { if ($describer instanceof ModelRegistryAwareInterface) { $describer->setModelRegistry($modelRegistry); } $describer->describe($this->openApi); } $analysis = new Analysis([], $context); $analysis->addAnnotation($this->openApi, $context); // Register model annotations $modelRegister = new ModelRegister($modelRegistry, $this->mediaTypes); $modelRegister($analysis); // Calculate the associated schemas $modelRegistry->registerSchemas(); $analysis->process($this->generator->getProcessors()); $analysis->validate(); if (isset($item)) { $this->cacheItemPool->save($item->set($this->openApi)); } return $this->openApi; } /** * Get an array of processors that will be used to process the OpenApi object. * * @param Generator $generator The generator instance to get the standard processors from * * @return array The array of processors */ private function getProcessors(Generator $generator): array { // Get the standard processors from the generator. $processors = $generator->getProcessors(); // Remove OperationId processor as we use a lot of generated annotations which do not have enough information in their context // to generate these ids properly. // @see \Nelmio\ApiDocBundle\OpenApiPhp\Util::createContext foreach ($processors as $key => $processor) { if ($processor instanceof \OpenApi\Processors\OperationId) { unset($processors[$key]); } } return $processors; } }