From 1b7e2262d1b18ffe5397675e20d837f9e3d6e1a9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Tamarelle?= Date: Tue, 23 Sep 2025 20:49:19 +0200 Subject: [PATCH] feat(symfony): Add an option to #[ApiResource] to keep the class as a service --- src/Metadata/ApiResource.php | 8 ++++++++ .../Bundle/DependencyInjection/ApiPlatformExtension.php | 9 +++++---- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/src/Metadata/ApiResource.php b/src/Metadata/ApiResource.php index 70759a4be2..9f16836014 100644 --- a/src/Metadata/ApiResource.php +++ b/src/Metadata/ApiResource.php @@ -971,6 +971,14 @@ public function __construct( protected ?bool $hideHydraOperation = null, ?bool $jsonStream = null, protected array $extraProperties = [], + + /** + * Let the resource class be registered as a service. + * Use it only if the class does not hold values. + * + * @var bool|null + */ + public bool $registerAsController = false, ) { parent::__construct( shortName: $shortName, diff --git a/src/Symfony/Bundle/DependencyInjection/ApiPlatformExtension.php b/src/Symfony/Bundle/DependencyInjection/ApiPlatformExtension.php index 249df64f6b..d1f2c6a9bd 100644 --- a/src/Symfony/Bundle/DependencyInjection/ApiPlatformExtension.php +++ b/src/Symfony/Bundle/DependencyInjection/ApiPlatformExtension.php @@ -189,10 +189,11 @@ public function load(array $configs, ContainerBuilder $container): void ->addTag('api_platform.uri_variables.transformer'); $container->registerForAutoconfiguration(ParameterProviderInterface::class) ->addTag('api_platform.parameter_provider'); - $container->registerAttributeForAutoconfiguration(ApiResource::class, static function (ChildDefinition $definition): void { - $definition->setAbstract(true) - ->addTag('api_platform.resource') - ->addTag('container.excluded', ['source' => 'by #[ApiResource] attribute']); + $container->registerAttributeForAutoconfiguration(ApiResource::class, static function (ChildDefinition $definition, ApiResource $attribute): void { + $definition->addTag('api_platform.resource'); + if ($attribute->registerAsController) { + $definition->setAbstract(true)->addTag('container.excluded', ['source' => 'by #[ApiResource] attribute']); + }; }); $container->registerAttributeForAutoconfiguration( AsResourceMutator::class,