Skip to content

Commit bbcce03

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

File tree

2 files changed

+31
-0
lines changed

2 files changed

+31
-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: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
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;
3637
use InvalidArgumentException;
3738
use LogicException;
@@ -1165,6 +1166,32 @@ public static function cacheConfigurationProvider(): array
11651166
];
11661167
}
11671168

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

0 commit comments

Comments
 (0)