Skip to content

Commit c33b49d

Browse files
committed
Ensure classes using the #[Entity] attribute are not declared as services
1 parent d9ea81d commit c33b49d

File tree

2 files changed

+32
-0
lines changed

2 files changed

+32
-0
lines changed

src/DependencyInjection/DoctrineExtension.php

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
use Doctrine\ORM\Mapping\Driver\SimplifiedXmlDriver;
2828
use Doctrine\ORM\Mapping\Driver\SimplifiedYamlDriver;
2929
use Doctrine\ORM\Mapping\Driver\StaticPHPDriver as LegacyStaticPHPDriver;
30+
use Doctrine\ORM\Mapping\Entity;
3031
use Doctrine\ORM\Proxy\Autoloader;
3132
use Doctrine\ORM\Proxy\ProxyFactory;
3233
use Doctrine\ORM\Tools\Console\Command\ConvertMappingCommand;
@@ -643,6 +644,9 @@ protected function ormLoad(array $config, ContainerBuilder $container)
643644
'connection' => $attribute->connection,
644645
]);
645646
});
647+
$container->registerAttributeForAutoconfiguration(Entity::class, static function (ChildDefinition $definition) {
648+
$definition->setAbstract(true)->addTag('container.excluded', ['source' => sprintf('with #[%s] attribute', Entity::class)]);
649+
});
646650

647651
/** @see DoctrineBundle::boot() */
648652
$container->getDefinition($defaultEntityManagerDefinitionId)

tests/DependencyInjection/DoctrineExtensionTest.php

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,9 @@
3232
use Doctrine\ORM\Mapping\Driver\AttributeDriver;
3333
use Doctrine\ORM\Mapping\Driver\SimplifiedXmlDriver;
3434
use Doctrine\ORM\Mapping\Driver\SimplifiedYamlDriver;
35+
use Doctrine\ORM\Mapping\Entity;
3536
use Doctrine\Persistence\Mapping\Driver\MappingDriverChain;
37+
use Fixtures\Bundles\AttributesBundle\Entity\TestCustomIdGeneratorEntity;
3638
use InvalidArgumentException;
3739
use LogicException;
3840
use PHPUnit\Framework\TestCase;
@@ -1165,6 +1167,32 @@ public static function cacheConfigurationProvider(): array
11651167
];
11661168
}
11671169

1170+
public function testEntityAttributeExcludesFromContainer()
1171+
{
1172+
if (! interface_exists(EntityManagerInterface::class)) {
1173+
self::markTestSkipped('This test requires ORM');
1174+
}
1175+
1176+
$container = $this->getContainer();
1177+
$extension = new DoctrineExtension();
1178+
1179+
$config = BundleConfigurationBuilder::createBuilder()
1180+
->addBaseConnection()
1181+
->addBaseEntityManager()
1182+
->build();
1183+
1184+
$extension->load([$config], $container);
1185+
1186+
$attributes = $container->getAutoconfiguredAttributes();
1187+
$this->assertInstanceOf(Closure::class, $attributes[Entity::class]);
1188+
1189+
$definition = new ChildDefinition('');
1190+
$attributes[Entity::class]($definition);
1191+
1192+
$this->assertSame([['source' => 'with #[Doctrine\ORM\Mapping\Entity] attribute']], $definition->getTag('container.excluded'));
1193+
$this->assertTrue($definition->isAbstract());
1194+
}
1195+
11681196
public function testAsEntityListenerAttribute()
11691197
{
11701198
if (! interface_exists(EntityManagerInterface::class)) {

0 commit comments

Comments
 (0)