*/ private $openApiRenderers = []; public function __construct(ContainerInterface $generatorLocator, ?OpenApiRenderer ...$openApiRenderers) { $this->generatorLocator = $generatorLocator; foreach ($openApiRenderers as $openApiRenderer) { if (null === $openApiRenderer) { continue; } $this->openApiRenderers[$openApiRenderer->getFormat()] = $openApiRenderer; } } public function getAvailableFormats(): array { return array_keys($this->openApiRenderers); } public function renderFromRequest(Request $request, string $format, $area, array $extraOptions = []) { $options = []; if ('' !== $request->getBaseUrl()) { $options += [ 'server_url' => $request->getSchemeAndHttpHost().$request->getBaseUrl(), ]; } $options += $extraOptions; return $this->render($format, $area, $options); } /** * @throws InvalidArgumentException If the area to dump is not valid */ public function render(string $format, string $area, array $options = []): string { if (!$this->generatorLocator->has($area)) { throw new InvalidArgumentException(sprintf('Area "%s" is not supported.', $area)); } elseif (!array_key_exists($format, $this->openApiRenderers)) { throw new InvalidArgumentException(sprintf('Format "%s" is not supported.', $format)); } /** @var OpenApi $spec */ $spec = $this->generatorLocator->get($area)->generate(); if (array_key_exists('server_url', $options) && $options['server_url']) { $spec->servers = [new Server(['url' => $options['server_url']])]; } return $this->openApiRenderers[$format]->render($spec, $options); } }