Skip to content

[v5] Refactoring #2219

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wants to merge 5 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 5 additions & 21 deletions ApiDocGenerator.php
Original file line number Diff line number Diff line change
Expand Up @@ -31,18 +31,6 @@ final class ApiDocGenerator
/** @var OpenApi */
private $openApi;

/** @var iterable|DescriberInterface[] */
private $describers;

/** @var iterable|ModelDescriberInterface[] */
private $modelDescribers;

/** @var CacheItemPoolInterface|null */
private $cacheItemPool;

/** @var string|null */
private $cacheItemId;

/** @var string[] */
private $alternativeNames = [];

Expand All @@ -51,7 +39,7 @@ final class ApiDocGenerator
/**
* @var ?string
*/
private $openApiVersion = null;
private $openApiVersion;

/** @var Generator */
private $generator;
Expand All @@ -60,26 +48,22 @@ final class ApiDocGenerator
* @param DescriberInterface[]|iterable $describers
* @param ModelDescriberInterface[]|iterable $modelDescribers
*/
public function __construct($describers, $modelDescribers, CacheItemPoolInterface $cacheItemPool = null, string $cacheItemId = null, Generator $generator = null)
public function __construct(private $describers, private $modelDescribers, private ?\Psr\Cache\CacheItemPoolInterface $cacheItemPool = null, private ?string $cacheItemId = null, Generator $generator = null)
{
$this->describers = $describers;
$this->modelDescribers = $modelDescribers;
$this->cacheItemPool = $cacheItemPool;
$this->cacheItemId = $cacheItemId;
$this->generator = $generator ?? new Generator($this->logger);
}

public function setAlternativeNames(array $alternativeNames)
public function setAlternativeNames(array $alternativeNames): void
{
$this->alternativeNames = $alternativeNames;
}

public function setMediaTypes(array $mediaTypes)
public function setMediaTypes(array $mediaTypes): void
{
$this->mediaTypes = $mediaTypes;
}

public function setOpenApiVersion(?string $openApiVersion)
public function setOpenApiVersion(?string $openApiVersion): void
{
$this->openApiVersion = $openApiVersion;
}
Expand Down
11 changes: 2 additions & 9 deletions Command/DumpCommand.php
Original file line number Diff line number Diff line change
Expand Up @@ -20,11 +20,6 @@

class DumpCommand extends Command
{
/**
* @var RenderOpenApi
*/
private $renderOpenApi;

/**
* @var mixed[]
*/
Expand All @@ -33,10 +28,8 @@ class DumpCommand extends Command
'swagger_ui_config' => [],
];

public function __construct(RenderOpenApi $renderOpenApi)
public function __construct(private readonly RenderOpenApi $renderOpenApi)
{
$this->renderOpenApi = $renderOpenApi;

parent::__construct();
}

Expand Down Expand Up @@ -69,7 +62,7 @@ protected function execute(InputInterface $input, OutputInterface $output): int

$options = [];
if (RenderOpenApi::HTML === $format) {
$rawHtmlConfig = json_decode($input->getOption('html-config'), true);
$rawHtmlConfig = json_decode((string) $input->getOption('html-config'), true);
$options = is_array($rawHtmlConfig) ? $rawHtmlConfig : $this->defaultHtmlConfig;
} elseif (RenderOpenApi::JSON === $format) {
$options = [
Expand Down
10 changes: 2 additions & 8 deletions Controller/DocumentationController.php
Original file line number Diff line number Diff line change
Expand Up @@ -19,14 +19,8 @@

final class DocumentationController
{
/**
* @var RenderOpenApi
*/
private $renderOpenApi;

public function __construct(RenderOpenApi $renderOpenApi)
public function __construct(private readonly RenderOpenApi $renderOpenApi)
{
$this->renderOpenApi = $renderOpenApi;
}

public function __invoke(Request $request, $area = 'default')
Expand All @@ -35,7 +29,7 @@ public function __invoke(Request $request, $area = 'default')
return JsonResponse::fromJsonString(
$this->renderOpenApi->renderFromRequest($request, RenderOpenApi::JSON, $area)
);
} catch (RenderInvalidArgumentException $e) {
} catch (RenderInvalidArgumentException) {
throw new BadRequestHttpException(sprintf('Area "%s" is not supported as it isn\'t defined in config.', $area));
}
}
Expand Down
16 changes: 2 additions & 14 deletions Controller/SwaggerUiController.php
Original file line number Diff line number Diff line change
Expand Up @@ -20,20 +20,8 @@

final class SwaggerUiController
{
/**
* @var RenderOpenApi
*/
private $renderOpenApi;

/**
* @var string
*/
private $uiRenderer;

public function __construct(RenderOpenApi $renderOpenApi, string $uiRenderer)
public function __construct(private readonly RenderOpenApi $renderOpenApi, private readonly string $uiRenderer)
{
$this->renderOpenApi = $renderOpenApi;
$this->uiRenderer = $uiRenderer;
}

public function __invoke(Request $request, $area = 'default')
Expand All @@ -51,7 +39,7 @@ public function __invoke(Request $request, $area = 'default')
return $response->setCharset('UTF-8');
} catch (RenderInvalidArgumentException $e) {
$advice = '';
if (false !== strpos($area, '.json')) {
if (str_contains((string) $area, '.json')) {
$advice = ' Since the area provided contains `.json`, the issue is likely caused by route priorities. Try switching the Swagger UI / the json documentation routes order.';
}

Expand Down
10 changes: 2 additions & 8 deletions Controller/YamlDocumentationController.php
Original file line number Diff line number Diff line change
Expand Up @@ -19,14 +19,8 @@

final class YamlDocumentationController
{
/**
* @var RenderOpenApi
*/
private $renderOpenApi;

public function __construct(RenderOpenApi $renderOpenApi)
public function __construct(private readonly RenderOpenApi $renderOpenApi)
{
$this->renderOpenApi = $renderOpenApi;
}

public function __invoke(Request $request, $area = 'default')
Expand All @@ -39,7 +33,7 @@ public function __invoke(Request $request, $area = 'default')
);

return $response->setCharset('UTF-8');
} catch (InvalidArgumentException $e) {
} catch (InvalidArgumentException) {
throw new BadRequestHttpException(sprintf('Area "%s" is not supported as it isn\'t defined in config.', $area));
}
}
Expand Down
2 changes: 1 addition & 1 deletion DependencyInjection/Compiler/PhpDocExtractorPass.php
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ final class PhpDocExtractorPass implements CompilerPassInterface
public function process(ContainerBuilder $container): void
{
if (!$container->hasDefinition('property_info.php_doc_extractor')) {
$definition = $container->register('property_info.php_doc_extractor', 'Symfony\Component\PropertyInfo\Extractor\PhpDocExtractor');
$definition = $container->register('property_info.php_doc_extractor', \Symfony\Component\PropertyInfo\Extractor\PhpDocExtractor::class);
$definition->addTag('property_info.description_extractor', ['priority' => -1000]);
$definition->addTag('property_info.type_extractor', ['priority' => -1001]);
}
Expand Down
14 changes: 4 additions & 10 deletions DependencyInjection/Configuration.php
Original file line number Diff line number Diff line change
Expand Up @@ -59,17 +59,11 @@ public function getConfigTreeBuilder(): TreeBuilder
]
)
->beforeNormalization()
->ifTrue(function ($v) {
return 0 === count($v) || isset($v['path_patterns']) || isset($v['host_patterns']) || isset($v['documentation']);
})
->then(function ($v) {
return ['default' => $v];
})
->ifTrue(fn($v) => 0 === count($v) || isset($v['path_patterns']) || isset($v['host_patterns']) || isset($v['documentation']))
->then(fn($v) => ['default' => $v])
->end()
->validate()
->ifTrue(function ($v) {
return !isset($v['default']);
})
->ifTrue(fn($v) => !isset($v['default']))
->thenInvalid('You must specify a `default` area under `nelmio_api_doc.areas`.')
->end()
->useAttributeAsKey('name')
Expand Down Expand Up @@ -123,7 +117,7 @@ public function getConfigTreeBuilder(): TreeBuilder
->variableNode('groups')
->defaultValue(null)
->validate()
->ifTrue(function ($v) { return null !== $v && !is_array($v); })
->ifTrue(fn($v) => null !== $v && !is_array($v))
->thenInvalid('Model groups must be either `null` or an array.')
->end()
->end()
Expand Down
77 changes: 34 additions & 43 deletions DependencyInjection/NelmioApiDocExtension.php
Original file line number Diff line number Diff line change
Expand Up @@ -161,7 +161,7 @@ public function load(array $configs, ContainerBuilder $container): void
->addTag('container.service_locator')
->addArgument(array_combine(
array_keys($config['areas']),
array_map(function ($area) { return new Reference(sprintf('nelmio_api_doc.generator.%s', $area)); }, array_keys($config['areas']))
array_map(fn($area) => new Reference(sprintf('nelmio_api_doc.generator.%s', $area)), array_keys($config['areas']))
));

$container->getDefinition('nelmio_api_doc.model_describers.object')
Expand All @@ -179,58 +179,51 @@ public function load(array $configs, ContainerBuilder $container): void
$container->getDefinition('nelmio_api_doc.route_describers.fos_rest')
->setArgument(1, $config['media_types']);
}

if (PHP_VERSION_ID > 80100) {
// Add autoconfiguration for route argument describer
$container->registerForAutoconfiguration(RouteArgumentDescriberInterface::class)
->addTag('nelmio_api_doc.route_argument_describer');

$container->register('nelmio_api_doc.route_describers.route_argument', RouteArgumentDescriber::class)
// Add autoconfiguration for route argument describer
$container->registerForAutoconfiguration(RouteArgumentDescriberInterface::class)
->addTag('nelmio_api_doc.route_argument_describer');
$container->register('nelmio_api_doc.route_describers.route_argument', RouteArgumentDescriber::class)
->setPublic(false)
->addTag('nelmio_api_doc.route_describer', ['priority' => -225])
->setArguments([
new Reference('argument_metadata_factory'),
new TaggedIteratorArgument('nelmio_api_doc.route_argument_describer'),
])
;
if (class_exists(MapQueryString::class)) {
$container->register('nelmio_api_doc.route_argument_describer.map_query_string', SymfonyMapQueryStringDescriber::class)
->setPublic(false)
->addTag('nelmio_api_doc.route_describer', ['priority' => -225])
->setArguments([
new Reference('argument_metadata_factory'),
new TaggedIteratorArgument('nelmio_api_doc.route_argument_describer'),
])
;

if (class_exists(MapQueryString::class)) {
$container->register('nelmio_api_doc.route_argument_describer.map_query_string', SymfonyMapQueryStringDescriber::class)
->setPublic(false)
->addTag('nelmio_api_doc.route_argument_describer', ['priority' => 0]);

$container->register('nelmio_api_doc.swagger.processor.map_query_string', MapQueryStringProcessor::class)
->setPublic(false)
->addTag('nelmio_api_doc.swagger.processor', ['priority' => 0]);
}

if (class_exists(MapRequestPayload::class)) {
$container->register('nelmio_api_doc.route_argument_describer.map_request_payload', SymfonyMapRequestPayloadDescriber::class)
->setPublic(false)
->addTag('nelmio_api_doc.route_argument_describer', ['priority' => 0]);
->addTag('nelmio_api_doc.route_argument_describer', ['priority' => 0]);

$container->register('nelmio_api_doc.swagger.processor.map_request_payload', MapRequestPayloadProcessor::class)
->setPublic(false)
->addTag('nelmio_api_doc.swagger.processor', ['priority' => 0]);
}
$container->register('nelmio_api_doc.swagger.processor.map_query_string', MapQueryStringProcessor::class)
->setPublic(false)
->addTag('nelmio_api_doc.swagger.processor', ['priority' => 0]);
}
if (class_exists(MapRequestPayload::class)) {
$container->register('nelmio_api_doc.route_argument_describer.map_request_payload', SymfonyMapRequestPayloadDescriber::class)
->setPublic(false)
->addTag('nelmio_api_doc.route_argument_describer', ['priority' => 0]);

if (class_exists(MapQueryParameter::class)) {
$container->register('nelmio_api_doc.route_argument_describer.map_query_parameter', SymfonyMapQueryParameterDescriber::class)
->setPublic(false)
->addTag('nelmio_api_doc.route_argument_describer', ['priority' => 0]);
}
$container->register('nelmio_api_doc.swagger.processor.map_request_payload', MapRequestPayloadProcessor::class)
->setPublic(false)
->addTag('nelmio_api_doc.swagger.processor', ['priority' => 0]);
}
if (class_exists(MapQueryParameter::class)) {
$container->register('nelmio_api_doc.route_argument_describer.map_query_parameter', SymfonyMapQueryParameterDescriber::class)
->setPublic(false)
->addTag('nelmio_api_doc.route_argument_describer', ['priority' => 0]);
}

$bundles = $container->getParameter('kernel.bundles');
if (!isset($bundles['TwigBundle']) || !class_exists('Symfony\Component\Asset\Packages')) {
if (!isset($bundles['TwigBundle']) || !class_exists(\Symfony\Component\Asset\Packages::class)) {
$container->removeDefinition('nelmio_api_doc.controller.swagger_ui');

$container->removeDefinition('nelmio_api_doc.render_docs.html');
$container->removeDefinition('nelmio_api_doc.render_docs.html.asset');
}

// ApiPlatform support
if (isset($bundles['ApiPlatformBundle']) && class_exists('ApiPlatform\Documentation\Documentation')) {
if (isset($bundles['ApiPlatformBundle']) && class_exists(\ApiPlatform\Documentation\Documentation::class)) {
$loader->load('api_platform.xml');
}

Expand Down Expand Up @@ -283,9 +276,7 @@ public function load(array $configs, ContainerBuilder $container): void

private function findNameAliases(array $names, string $area): array
{
$nameAliases = array_filter($names, function (array $aliasInfo) use ($area) {
return empty($aliasInfo['areas']) || in_array($area, $aliasInfo['areas'], true);
});
$nameAliases = array_filter($names, fn(array $aliasInfo) => empty($aliasInfo['areas']) || in_array($area, $aliasInfo['areas'], true));

$aliases = [];
foreach ($nameAliases as $nameAlias) {
Expand Down
4 changes: 2 additions & 2 deletions Describer/ApiPlatformDescriber.php
Original file line number Diff line number Diff line change
Expand Up @@ -21,11 +21,11 @@ final class ApiPlatformDescriber extends ExternalDocDescriber
public function __construct(object $documentation, NormalizerInterface $normalizer)
{
if (!$documentation instanceof DocumentationInterface && !$documentation instanceof OpenApi) {
throw new \InvalidArgumentException(sprintf('Argument 1 passed to %s() must be an instance of %s or %s. The documentation provided is an instance of %s.', __METHOD__, Documentation::class, OpenApi::class, get_class($documentation)));
throw new \InvalidArgumentException(sprintf('Argument 1 passed to %s() must be an instance of %s or %s. The documentation provided is an instance of %s.', __METHOD__, Documentation::class, OpenApi::class, $documentation::class));
}

if (!$normalizer->supportsNormalization($documentation, 'json')) {
throw new \InvalidArgumentException(sprintf('Argument 2 passed to %s() must implement %s and support normalization of %s. The normalizer provided is an instance of %s.', __METHOD__, NormalizerInterface::class, Documentation::class, get_class($normalizer)));
throw new \InvalidArgumentException(sprintf('Argument 2 passed to %s() must implement %s and support normalization of %s. The normalizer provided is an instance of %s.', __METHOD__, NormalizerInterface::class, Documentation::class, $normalizer::class));
}

parent::__construct(function () use ($documentation, $normalizer) {
Expand Down
2 changes: 1 addition & 1 deletion Describer/DefaultDescriber.php
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@
*/
final class DefaultDescriber implements DescriberInterface
{
public function describe(OA\OpenApi $api)
public function describe(OA\OpenApi $api): void
{
// Info
/** @var OA\Info $info */
Expand Down
7 changes: 2 additions & 5 deletions Describer/ExternalDocDescriber.php
Original file line number Diff line number Diff line change
Expand Up @@ -18,18 +18,15 @@ class ExternalDocDescriber implements DescriberInterface
{
private $externalDoc;

private $overwrite;

/**
* @param array|callable $externalDoc
*/
public function __construct($externalDoc, bool $overwrite = false)
public function __construct($externalDoc, private readonly bool $overwrite = false)
{
$this->externalDoc = $externalDoc;
$this->overwrite = $overwrite;
}

public function describe(OA\OpenApi $api)
public function describe(OA\OpenApi $api): void
{
$externalDoc = $this->getExternalDoc();

Expand Down
2 changes: 1 addition & 1 deletion Describer/ModelRegistryAwareTrait.php
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ trait ModelRegistryAwareTrait
*/
private $modelRegistry;

public function setModelRegistry(ModelRegistry $modelRegistry)
public function setModelRegistry(ModelRegistry $modelRegistry): void
{
$this->modelRegistry = $modelRegistry;
}
Expand Down
Loading