Skip to content

Commit a91383d

Browse files
GromNaNostrolucky
authored andcommitted
Ensure classes using the #[Entity] attribute are not declared as services
1 parent fdeecd4 commit a91383d

File tree

2 files changed

+53
-0
lines changed

2 files changed

+53
-0
lines changed

src/DependencyInjection/DoctrineExtension.php

+13
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,9 @@
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\Embeddable;
31+
use Doctrine\ORM\Mapping\Entity;
32+
use Doctrine\ORM\Mapping\MappedSuperclass;
3033
use Doctrine\ORM\Proxy\Autoloader;
3134
use Doctrine\ORM\Proxy\ProxyFactory;
3235
use Doctrine\ORM\Tools\Console\Command\ConvertMappingCommand;
@@ -644,6 +647,16 @@ protected function ormLoad(array $config, ContainerBuilder $container)
644647
]);
645648
});
646649

650+
$container->registerAttributeForAutoconfiguration(Embeddable::class, static function (ChildDefinition $definition) {
651+
$definition->setAbstract(true)->addTag('container.excluded', ['source' => sprintf('with #[%s] attribute', Embeddable::class)]);
652+
});
653+
$container->registerAttributeForAutoconfiguration(Entity::class, static function (ChildDefinition $definition) {
654+
$definition->setAbstract(true)->addTag('container.excluded', ['source' => sprintf('with #[%s] attribute', Entity::class)]);
655+
});
656+
$container->registerAttributeForAutoconfiguration(MappedSuperclass::class, static function (ChildDefinition $definition) {
657+
$definition->setAbstract(true)->addTag('container.excluded', ['source' => sprintf('with #[%s] attribute', MappedSuperclass::class)]);
658+
});
659+
647660
/** @see DoctrineBundle::boot() */
648661
$container->getDefinition($defaultEntityManagerDefinitionId)
649662
->addTag('container.preload', [

tests/DependencyInjection/DoctrineExtensionTest.php

+40
Original file line numberDiff line numberDiff line change
@@ -32,6 +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\Embeddable;
36+
use Doctrine\ORM\Mapping\Entity;
37+
use Doctrine\ORM\Mapping\MappedSuperclass;
3538
use Doctrine\Persistence\Mapping\Driver\MappingDriverChain;
3639
use InvalidArgumentException;
3740
use LogicException;
@@ -1165,6 +1168,43 @@ public static function cacheConfigurationProvider(): array
11651168
];
11661169
}
11671170

1171+
/** @return array<array{0: class-string}> */
1172+
public static function provideAttributeExcludedFromContainer(): array
1173+
{
1174+
return [
1175+
'Embeddable' => [Embeddable::class],
1176+
'Entity' => [Entity::class],
1177+
'MappedSuperclass' => [MappedSuperclass::class],
1178+
];
1179+
}
1180+
1181+
/** @dataProvider provideAttributeExcludedFromContainer */
1182+
public function testEntityAttributeExcludesFromContainer(string $class)
1183+
{
1184+
if (! interface_exists(EntityManagerInterface::class)) {
1185+
self::markTestSkipped('This test requires ORM');
1186+
}
1187+
1188+
$container = $this->getContainer();
1189+
$extension = new DoctrineExtension();
1190+
1191+
$config = BundleConfigurationBuilder::createBuilder()
1192+
->addBaseConnection()
1193+
->addBaseEntityManager()
1194+
->build();
1195+
1196+
$extension->load([$config], $container);
1197+
1198+
$attributes = $container->getAutoconfiguredAttributes();
1199+
$this->assertInstanceOf(Closure::class, $attributes[$class]);
1200+
1201+
$definition = new ChildDefinition('');
1202+
$attributes[$class]($definition);
1203+
1204+
$this->assertSame([['source' => sprintf('with #[%s] attribute', $class)]], $definition->getTag('container.excluded'));
1205+
$this->assertTrue($definition->isAbstract());
1206+
}
1207+
11681208
public function testAsEntityListenerAttribute()
11691209
{
11701210
if (! interface_exists(EntityManagerInterface::class)) {

0 commit comments

Comments
 (0)