From bbcce034b7dd2a810da68a68747b1982ccf762fb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Tamarelle?= Date: Thu, 6 Feb 2025 22:27:11 +0100 Subject: [PATCH] Ensure classes using the #[Entity] attribute are not declared as services --- src/DependencyInjection/DoctrineExtension.php | 4 +++ .../DoctrineExtensionTest.php | 27 +++++++++++++++++++ 2 files changed, 31 insertions(+) diff --git a/src/DependencyInjection/DoctrineExtension.php b/src/DependencyInjection/DoctrineExtension.php index 6d2c95c7..b17306ba 100644 --- a/src/DependencyInjection/DoctrineExtension.php +++ b/src/DependencyInjection/DoctrineExtension.php @@ -27,6 +27,7 @@ use Doctrine\ORM\Mapping\Driver\SimplifiedXmlDriver; use Doctrine\ORM\Mapping\Driver\SimplifiedYamlDriver; use Doctrine\ORM\Mapping\Driver\StaticPHPDriver as LegacyStaticPHPDriver; +use Doctrine\ORM\Mapping\Entity; use Doctrine\ORM\Proxy\Autoloader; use Doctrine\ORM\Proxy\ProxyFactory; use Doctrine\ORM\Tools\Console\Command\ConvertMappingCommand; @@ -643,6 +644,9 @@ protected function ormLoad(array $config, ContainerBuilder $container) 'connection' => $attribute->connection, ]); }); + $container->registerAttributeForAutoconfiguration(Entity::class, static function (ChildDefinition $definition) { + $definition->setAbstract(true)->addTag('container.excluded', ['source' => sprintf('with #[%s] attribute', Entity::class)]); + }); /** @see DoctrineBundle::boot() */ $container->getDefinition($defaultEntityManagerDefinitionId) diff --git a/tests/DependencyInjection/DoctrineExtensionTest.php b/tests/DependencyInjection/DoctrineExtensionTest.php index 51e69eec..df39a716 100644 --- a/tests/DependencyInjection/DoctrineExtensionTest.php +++ b/tests/DependencyInjection/DoctrineExtensionTest.php @@ -32,6 +32,7 @@ use Doctrine\ORM\Mapping\Driver\AttributeDriver; use Doctrine\ORM\Mapping\Driver\SimplifiedXmlDriver; use Doctrine\ORM\Mapping\Driver\SimplifiedYamlDriver; +use Doctrine\ORM\Mapping\Entity; use Doctrine\Persistence\Mapping\Driver\MappingDriverChain; use InvalidArgumentException; use LogicException; @@ -1165,6 +1166,32 @@ public static function cacheConfigurationProvider(): array ]; } + public function testEntityAttributeExcludesFromContainer() + { + if (! interface_exists(EntityManagerInterface::class)) { + self::markTestSkipped('This test requires ORM'); + } + + $container = $this->getContainer(); + $extension = new DoctrineExtension(); + + $config = BundleConfigurationBuilder::createBuilder() + ->addBaseConnection() + ->addBaseEntityManager() + ->build(); + + $extension->load([$config], $container); + + $attributes = $container->getAutoconfiguredAttributes(); + $this->assertInstanceOf(Closure::class, $attributes[Entity::class]); + + $definition = new ChildDefinition(''); + $attributes[Entity::class]($definition); + + $this->assertSame([['source' => 'with #[Doctrine\ORM\Mapping\Entity] attribute']], $definition->getTag('container.excluded')); + $this->assertTrue($definition->isAbstract()); + } + public function testAsEntityListenerAttribute() { if (! interface_exists(EntityManagerInterface::class)) {