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)) {