Skip to content

Commit d5297d7

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

File tree

2 files changed

+35
-0
lines changed

2 files changed

+35
-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: 31 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;
@@ -1166,6 +1168,35 @@ public static function cacheConfigurationProvider(): array
11661168
];
11671169
}
11681170

1171+
public function testEntityAttributeExcludesFromContainer()
1172+
{
1173+
if (! interface_exists(Entity::class)) {
1174+
self::markTestSkipped('This test requires ORM');
1175+
}
1176+
1177+
$container = $this->getContainer();
1178+
$extension = new DoctrineExtension();
1179+
1180+
$config = BundleConfigurationBuilder::createBuilder()
1181+
->addBaseConnection()
1182+
->addBaseEntityManager()
1183+
->build();
1184+
1185+
$extension->load([$config], $container);
1186+
1187+
$attributes = $container->getAutoconfiguredAttributes();
1188+
$this->assertInstanceOf(Closure::class, $attributes[Entity::class]);
1189+
1190+
$reflector = new ReflectionClass(TestCustomIdGeneratorEntity::class);
1191+
$definition = new ChildDefinition('');
1192+
$attribute = $reflector->getAttributes(Entity::class)[0]->newInstance();
1193+
1194+
$attributes[Entity::class]($definition, $attribute);
1195+
1196+
$this->assertSame([['source' => 'with #[Doctrine\ORM\Mapping\Entity] attribute']], $definition->getTag('container.excluded'));
1197+
$this->assertTrue($definition->isAbstract());
1198+
}
1199+
11691200
/** @requires PHP 8 */
11701201
public function testAsEntityListenerAttribute()
11711202
{

0 commit comments

Comments
 (0)