Skip to content

Commit e7510b4

Browse files
authored
Exclude other Document attributes from DIC (#884)
1 parent a5828b2 commit e7510b4

File tree

2 files changed

+56
-1
lines changed

2 files changed

+56
-1
lines changed

src/DependencyInjection/DoctrineMongoDBExtension.php

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,11 @@
1717
use Doctrine\ODM\MongoDB\Configuration as ODMConfiguration;
1818
use Doctrine\ODM\MongoDB\DocumentManager;
1919
use Doctrine\ODM\MongoDB\Mapping\Annotations\Document;
20+
use Doctrine\ODM\MongoDB\Mapping\Annotations\EmbeddedDocument;
21+
use Doctrine\ODM\MongoDB\Mapping\Annotations\File;
22+
use Doctrine\ODM\MongoDB\Mapping\Annotations\MappedSuperclass;
23+
use Doctrine\ODM\MongoDB\Mapping\Annotations\QueryResultDocument;
24+
use Doctrine\ODM\MongoDB\Mapping\Annotations\View;
2025
use Doctrine\ODM\MongoDB\Mapping\Driver\AttributeDriver;
2126
use Doctrine\Persistence\Mapping\Driver\MappingDriverChain;
2227
use Doctrine\Persistence\Proxy;
@@ -151,8 +156,24 @@ public function load(array $configs, ContainerBuilder $container): void
151156
]);
152157
});
153158

159+
// Document classes are excluded from the container by default
154160
$container->registerAttributeForAutoconfiguration(Document::class, static function (ChildDefinition $definition): void {
155-
$definition->addTag('container.excluded', ['source' => __FILE__]);
161+
$definition->addTag('container.excluded', ['source' => sprintf('with #[%s] attribute', Document::class)])->setAbstract(true);
162+
});
163+
$container->registerAttributeForAutoconfiguration(EmbeddedDocument::class, static function (ChildDefinition $definition): void {
164+
$definition->addTag('container.excluded', ['source' => sprintf('with #[%s] attribute', EmbeddedDocument::class)])->setAbstract(true);
165+
});
166+
$container->registerAttributeForAutoconfiguration(MappedSuperclass::class, static function (ChildDefinition $definition): void {
167+
$definition->addTag('container.excluded', ['source' => sprintf('with #[%s] attribute', MappedSuperclass::class)])->setAbstract(true);
168+
});
169+
$container->registerAttributeForAutoconfiguration(View::class, static function (ChildDefinition $definition): void {
170+
$definition->addTag('container.excluded', ['source' => sprintf('with #[%s] attribute', View::class)])->setAbstract(true);
171+
});
172+
$container->registerAttributeForAutoconfiguration(QueryResultDocument::class, static function (ChildDefinition $definition): void {
173+
$definition->addTag('container.excluded', ['source' => sprintf('with #[%s] attribute', QueryResultDocument::class)])->setAbstract(true);
174+
});
175+
$container->registerAttributeForAutoconfiguration(File::class, static function (ChildDefinition $definition): void {
176+
$definition->addTag('container.excluded', ['source' => sprintf('with #[%s] attribute', File::class)])->setAbstract(true);
156177
});
157178

158179
$this->loadMessengerServices($container, $loader);

tests/DependencyInjection/DoctrineMongoDBExtensionTest.php

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,17 @@
44

55
namespace Doctrine\Bundle\MongoDBBundle\Tests\DependencyInjection;
66

7+
use Closure;
78
use Composer\InstalledVersions;
89
use Composer\Semver\VersionParser;
910
use Doctrine\Bundle\MongoDBBundle\Attribute\MapDocument;
1011
use Doctrine\Bundle\MongoDBBundle\DependencyInjection\DoctrineMongoDBExtension;
1112
use Doctrine\Bundle\MongoDBBundle\Tests\DependencyInjection\Fixtures\Bundles\DocumentListenerBundle\EventListener\TestAttributeListener;
13+
use Doctrine\ODM\MongoDB\Mapping\Annotations;
1214
use PHPUnit\Framework\TestCase;
1315
use Symfony\Bridge\Doctrine\Messenger\DoctrineClearEntityManagerWorkerSubscriber;
1416
use Symfony\Component\DependencyInjection\Alias;
17+
use Symfony\Component\DependencyInjection\ChildDefinition;
1518
use Symfony\Component\DependencyInjection\Container;
1619
use Symfony\Component\DependencyInjection\ContainerBuilder;
1720
use Symfony\Component\DependencyInjection\Definition;
@@ -23,6 +26,7 @@
2326
use function class_exists;
2427
use function interface_exists;
2528
use function is_dir;
29+
use function sprintf;
2630
use function sys_get_temp_dir;
2731

2832
class DoctrineMongoDBExtensionTest extends TestCase
@@ -102,6 +106,36 @@ public function testAsDocumentListenerAttribute(): void
102106
], $listenerDefinition->getTag('doctrine_mongodb.odm.event_listener'));
103107
}
104108

109+
/** @return array<array{0: class-string}> */
110+
public static function provideAttributeExcludedFromContainer(): array
111+
{
112+
return [
113+
'Document' => [Annotations\Document::class],
114+
'EmbeddedDocument' => [Annotations\EmbeddedDocument::class],
115+
'MappedSuperclass' => [Annotations\MappedSuperclass::class],
116+
'View' => [Annotations\View::class],
117+
'QueryResultDocument' => [Annotations\QueryResultDocument::class],
118+
'File' => [Annotations\File::class],
119+
];
120+
}
121+
122+
/** @dataProvider provideAttributeExcludedFromContainer */
123+
public function testDocumentAttributeExcludesFromContainer(string $class): void
124+
{
125+
$container = $this->getContainer();
126+
$extension = new DoctrineMongoDBExtension();
127+
$extension->load($this->buildConfiguration(), $container);
128+
129+
$attributes = $container->getAutoconfiguredAttributes();
130+
$this->assertInstanceOf(Closure::class, $attributes[$class]);
131+
132+
$definition = new ChildDefinition('');
133+
$attributes[$class]($definition);
134+
135+
$this->assertSame([['source' => sprintf('with #[%s] attribute', $class)]], $definition->getTag('container.excluded'));
136+
$this->assertTrue($definition->isAbstract());
137+
}
138+
105139
/** @param string|string[] $bundles */
106140
private function getContainer(string|array $bundles = 'OtherXmlBundle'): ContainerBuilder
107141
{

0 commit comments

Comments
 (0)