Skip to content

Commit cddd0c5

Browse files
committed
Merge remote-tracking branch 'origin/2.17.x' into 3.0.x
2 parents a09bd83 + efc28cb commit cddd0c5

16 files changed

Lines changed: 172 additions & 233 deletions

src/DependencyInjection/Compiler/EntityListenerPass.php

Lines changed: 50 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
use Doctrine\Bundle\DoctrineBundle\Mapping\EntityListenerServiceResolver;
99
use Symfony\Component\DependencyInjection\ChildDefinition;
1010
use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
11-
use Symfony\Component\DependencyInjection\Compiler\PriorityTaggedServiceTrait;
1211
use Symfony\Component\DependencyInjection\Compiler\ServiceLocatorTagPass;
1312
use Symfony\Component\DependencyInjection\ContainerBuilder;
1413
use Symfony\Component\DependencyInjection\Definition;
@@ -19,6 +18,7 @@
1918
use function method_exists;
2019
use function sprintf;
2120
use function substr;
21+
use function usort;
2222

2323
/**
2424
* Class for Symfony bundles to register entity listeners
@@ -27,66 +27,73 @@
2727
*/
2828
class EntityListenerPass implements CompilerPassInterface
2929
{
30-
use PriorityTaggedServiceTrait;
31-
3230
public function process(ContainerBuilder $container): void
3331
{
34-
$resolvers = $this->findAndSortTaggedServices('doctrine.orm.entity_listener', $container);
35-
3632
$lazyServiceReferencesByResolver = [];
3733

38-
foreach ($resolvers as $reference) {
39-
$id = $reference->__toString();
40-
foreach ($container->getDefinition($id)->getTag('doctrine.orm.entity_listener') as $attributes) {
41-
$name = $attributes['entity_manager'] ?? $container->getParameter('doctrine.default_entity_manager');
42-
$entityManager = sprintf('doctrine.orm.%s_entity_manager', $name);
34+
$serviceTags = [];
35+
foreach ($container->findTaggedServiceIds('doctrine.orm.entity_listener', true) as $id => $tags) {
36+
foreach ($tags as $attributes) {
37+
$serviceTags[] = [
38+
'serviceId' => $id,
39+
'attributes' => $attributes,
40+
];
41+
}
42+
}
4343

44-
if (! $container->hasDefinition($entityManager)) {
45-
continue;
46-
}
44+
usort($serviceTags, static fn (array $a, array $b) => ($b['attributes']['priority'] ?? 0) <=> ($a['attributes']['priority'] ?? 0));
4745

48-
$resolverId = sprintf('doctrine.orm.%s_entity_listener_resolver', $name);
46+
foreach ($serviceTags as $tag) {
47+
$id = $tag['serviceId'];
48+
$attributes = $tag['attributes'];
49+
$name = $attributes['entity_manager'] ?? $container->getParameter('doctrine.default_entity_manager');
50+
$entityManager = sprintf('doctrine.orm.%s_entity_manager', $name);
4951

50-
if (! $container->has($resolverId)) {
51-
continue;
52-
}
52+
if (! $container->hasDefinition($entityManager)) {
53+
continue;
54+
}
5355

54-
$resolver = $container->findDefinition($resolverId);
55-
$resolver->setPublic(true);
56+
$resolverId = sprintf('doctrine.orm.%s_entity_listener_resolver', $name);
5657

57-
if (isset($attributes['entity'])) {
58-
$this->attachToListener($container, $name, $this->getConcreteDefinitionClass($container->findDefinition($id), $container, $id), $attributes);
59-
}
58+
if (! $container->has($resolverId)) {
59+
continue;
60+
}
6061

61-
$resolverClass = $this->getResolverClass($resolver, $container, $resolverId);
62-
$resolverSupportsLazyListeners = is_a($resolverClass, EntityListenerServiceResolver::class, true);
62+
$resolver = $container->findDefinition($resolverId);
63+
$resolver->setPublic(true);
6364

64-
$lazyByAttribute = isset($attributes['lazy']) && $attributes['lazy'];
65-
if ($lazyByAttribute && ! $resolverSupportsLazyListeners) {
66-
throw new InvalidArgumentException(sprintf(
67-
'Lazy-loaded entity listeners can only be resolved by a resolver implementing %s.',
68-
EntityListenerServiceResolver::class,
69-
));
70-
}
65+
if (isset($attributes['entity'])) {
66+
$this->attachToListener($container, $name, $this->getConcreteDefinitionClass($container->findDefinition($id), $container, $id), $attributes);
67+
}
7168

72-
if (! isset($attributes['lazy']) && $resolverSupportsLazyListeners || $lazyByAttribute) {
73-
$listener = $container->findDefinition($id);
69+
$resolverClass = $this->getResolverClass($resolver, $container, $resolverId);
70+
$resolverSupportsLazyListeners = is_a($resolverClass, EntityListenerServiceResolver::class, true);
7471

75-
$resolver->addMethodCall('registerService', [$this->getConcreteDefinitionClass($listener, $container, $id), $id]);
72+
$lazyByAttribute = isset($attributes['lazy']) && $attributes['lazy'];
73+
if ($lazyByAttribute && ! $resolverSupportsLazyListeners) {
74+
throw new InvalidArgumentException(sprintf(
75+
'Lazy-loaded entity listeners can only be resolved by a resolver implementing %s.',
76+
EntityListenerServiceResolver::class,
77+
));
78+
}
79+
80+
if (! isset($attributes['lazy']) && $resolverSupportsLazyListeners || $lazyByAttribute) {
81+
$listener = $container->findDefinition($id);
7682

77-
// if the resolver uses the default class we will use a service locator for all listeners
78-
if ($resolverClass === ContainerEntityListenerResolver::class) {
79-
if (! isset($lazyServiceReferencesByResolver[$resolverId])) {
80-
$lazyServiceReferencesByResolver[$resolverId] = [];
81-
}
83+
$resolver->addMethodCall('registerService', [$this->getConcreteDefinitionClass($listener, $container, $id), $id]);
8284

83-
$lazyServiceReferencesByResolver[$resolverId][$id] = new Reference($id);
84-
} else {
85-
$listener->setPublic(true);
85+
// if the resolver uses the default class we will use a service locator for all listeners
86+
if ($resolverClass === ContainerEntityListenerResolver::class) {
87+
if (! isset($lazyServiceReferencesByResolver[$resolverId])) {
88+
$lazyServiceReferencesByResolver[$resolverId] = [];
8689
}
90+
91+
$lazyServiceReferencesByResolver[$resolverId][$id] = new Reference($id);
8792
} else {
88-
$resolver->addMethodCall('register', [new Reference($id)]);
93+
$listener->setPublic(true);
8994
}
95+
} else {
96+
$resolver->addMethodCall('register', [new Reference($id)]);
9097
}
9198
}
9299

src/DependencyInjection/Configuration.php

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@
2121
use function array_key_exists;
2222
use function array_keys;
2323
use function array_pop;
24-
use function assert;
2524
use function class_exists;
2625
use function constant;
2726
use function count;
@@ -54,9 +53,7 @@ public function getConfigTreeBuilder(): TreeBuilder
5453
$treeBuilder = new TreeBuilder('doctrine');
5554
$rootNode = $treeBuilder->getRootNode();
5655

57-
/* @phpstan-ignore argument.type (symfony plugin needed) */
5856
$this->addDbalSection($rootNode);
59-
/* @phpstan-ignore argument.type (symfony plugin needed) */
6057
$this->addOrmSection($rootNode);
6158

6259
return $treeBuilder;
@@ -166,7 +163,6 @@ private function getDbalConnectionsNode(): ArrayNodeDefinition
166163
->requiresAtLeastOneElement()
167164
->useAttributeAsKey('name')
168165
->prototype('array');
169-
assert($connectionNode instanceof ArrayNodeDefinition);
170166

171167
$this->configureDbalDriverNode($connectionNode);
172168

@@ -222,13 +218,8 @@ private function getDbalConnectionsNode(): ArrayNodeDefinition
222218
->arrayNode('replicas')
223219
->useAttributeAsKey('name')
224220
->prototype('array');
225-
226-
assert($replicaNode instanceof ArrayNodeDefinition);
227-
228221
$this->configureDbalDriverNode($replicaNode);
229222

230-
assert($node instanceof ArrayNodeDefinition);
231-
232223
return $node;
233224
}
234225

@@ -715,8 +706,6 @@ private function getOrmEntityManagersNode(): ArrayNodeDefinition
715706
->end()
716707
->end();
717708

718-
assert($node instanceof ArrayNodeDefinition);
719-
720709
return $node;
721710
}
722711

@@ -743,8 +732,6 @@ private function getOrmCacheDriverNode(string $name): ArrayNodeDefinition
743732
$node->addDefaultsIfNotSet();
744733
}
745734

746-
assert($node instanceof ArrayNodeDefinition);
747-
748735
return $node;
749736
}
750737
}

tests/Command/CreateDatabaseDoctrineTest.php

Lines changed: 6 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -64,37 +64,22 @@ public function testExecute(): void
6464
private function getMockContainer(string $connectionName, array|null $params = null): MockObject
6565
{
6666
// Mock the container and everything you'll need here
67-
$mockDoctrine = $this->getMockBuilder(ManagerRegistry::class)
68-
->getMock();
67+
$mockDoctrine = $this->createStub(ManagerRegistry::class);
6968

70-
$mockDoctrine->expects($this->any())
71-
->method('getDefaultConnectionName')
72-
->withAnyParameters()
73-
->willReturn($connectionName);
69+
$mockDoctrine->method('getDefaultConnectionName')->willReturn($connectionName);
7470

7571
$config = (new Configuration())->setSchemaManagerFactory($this->createMock(SchemaManagerFactory::class));
7672

77-
$mockConnection = $this->createMock(Connection::class);
73+
$mockConnection = $this->createStub(Connection::class);
7874
$mockConnection->method('getConfiguration')->willReturn($config);
79-
80-
$mockConnection->expects($this->any())
81-
->method('getParams')
82-
->withAnyParameters()
83-
->willReturn($params);
84-
85-
$mockDoctrine->expects($this->any())
86-
->method('getConnection')
87-
->withAnyParameters()
88-
->willReturn($mockConnection);
75+
$mockConnection->method('getParams')->willReturn($params);
76+
$mockDoctrine->method('getConnection')->willReturn($mockConnection);
8977

9078
$mockContainer = $this->getMockBuilder(Container::class)
9179
->onlyMethods(['get'])
9280
->getMock();
9381

94-
$mockContainer->expects($this->any())
95-
->method('get')
96-
->with('doctrine')
97-
->willReturn($mockDoctrine);
82+
$mockContainer->method('get')->with('doctrine')->willReturn($mockDoctrine);
9883

9984
return $mockContainer;
10085
}

tests/Command/DropDatabaseDoctrineTest.php

Lines changed: 5 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -142,35 +142,22 @@ public static function provideIncompatibleDriverOptions(): Generator
142142
private function getMockContainer(string $connectionName, array $params): MockObject
143143
{
144144
// Mock the container and everything you'll need here
145-
$mockDoctrine = $this->getMockBuilder(ManagerRegistry::class)
146-
->getMock();
145+
$mockDoctrine = $this->createStub(ManagerRegistry::class);
147146

148-
$mockDoctrine->expects($this->any())
149-
->method('getDefaultConnectionName')
150-
->withAnyParameters()
151-
->willReturn($connectionName);
147+
$mockDoctrine->method('getDefaultConnectionName')->willReturn($connectionName);
152148

153149
$config = (new Configuration())->setSchemaManagerFactory(new DefaultSchemaManagerFactory());
154150

155151
$mockConnection = $this->createMock(Connection::class);
156152
$mockConnection->method('getConfiguration')->willReturn($config);
157-
158-
$mockConnection->expects($this->any())
159-
->method('getParams')
160-
->withAnyParameters()
161-
->willReturn($params);
162-
163-
$mockDoctrine->expects($this->any())
164-
->method('getConnection')
165-
->withAnyParameters()
166-
->willReturn($mockConnection);
153+
$mockConnection->method('getParams')->willReturn($params);
154+
$mockDoctrine->method('getConnection')->willReturn($mockConnection);
167155

168156
$mockContainer = $this->getMockBuilder(Container::class)
169157
->onlyMethods(['get'])
170158
->getMock();
171159

172-
$mockContainer->expects($this->any())
173-
->method('get')
160+
$mockContainer->method('get')
174161
->with('doctrine')
175162
->willReturn($mockDoctrine);
176163

tests/ConnectionFactoryTest.php

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,9 @@
99
use Doctrine\DBAL\Connection;
1010
use Doctrine\DBAL\Driver;
1111
use Doctrine\DBAL\Schema\DefaultSchemaManagerFactory;
12-
use Doctrine\Deprecations\PHPUnit\VerifyDeprecations;
1312

1413
class ConnectionFactoryTest extends TestCase
1514
{
16-
use VerifyDeprecations;
17-
1815
private Configuration $configuration;
1916

2017
protected function setUp(): void

tests/DataCollector/DoctrineDataCollectorTest.php

Lines changed: 21 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -32,31 +32,23 @@ public function testCollectEntities(): void
3232
self::markTestSkipped('This test requires ORM');
3333
}
3434

35-
$manager = $this->createMock(EntityManagerInterface::class);
35+
$manager = $this->createStub(EntityManagerInterface::class);
3636
$config = $this->createMock(Configuration::class);
3737
$factory = $this->createMock(ClassMetadataFactory::class);
3838
$collector = $this->createCollector(['default' => $manager], true, $this->createMock(DebugDataHolder::class));
3939
$unitOfWork = $this->createMock(UnitOfWork::class);
4040

41-
$manager->expects($this->any())
42-
->method('getMetadataFactory')
43-
->will($this->returnValue($factory));
44-
$manager->expects($this->any())
45-
->method('getConfiguration')
46-
->will($this->returnValue($config));
47-
$manager->expects($this->any())
48-
->method('getUnitOfWork')
49-
->will($this->returnValue($unitOfWork));
50-
$unitOfWork->expects($this->any())
51-
->method('getIdentityMap')
52-
->will($this->returnValue([
53-
self::FIRST_ENTITY => [new stdClass()],
54-
self::SECOND_ENTITY => [new stdClass(), new stdClass()],
55-
]));
41+
$manager->method('getMetadataFactory')->willReturn($factory);
42+
$manager->method('getConfiguration')->willReturn($config);
43+
$manager->method('getUnitOfWork')->willReturn($unitOfWork);
44+
$unitOfWork->method('getIdentityMap')->willReturn([
45+
self::FIRST_ENTITY => [new stdClass()],
46+
self::SECOND_ENTITY => [new stdClass(), new stdClass()],
47+
]);
5648

5749
$config->expects($this->once())
5850
->method('isSecondLevelCacheEnabled')
59-
->will($this->returnValue(false));
51+
->willReturn(false);
6052

6153
$metadatas = [
6254
$this->createEntityMetadata(self::FIRST_ENTITY),
@@ -65,7 +57,7 @@ public function testCollectEntities(): void
6557
];
6658
$factory->expects($this->once())
6759
->method('getLoadedMetadata')
68-
->will($this->returnValue($metadatas));
60+
->willReturn($metadatas);
6961

7062
$collector->collect(new Request(), new Response());
7163

@@ -84,18 +76,12 @@ public function testDoesNotCollectEntities(): void
8476
$manager = $this->createMock(EntityManager::class);
8577
$config = $this->createMock(Configuration::class);
8678
$collector = $this->createCollector(['default' => $manager], false, $this->createMock(DebugDataHolder::class));
87-
$unitOfWork = $this->createMock(UnitOfWork::class);
79+
$unitOfWork = $this->createStub(UnitOfWork::class);
8880

89-
$manager->expects($this->never())
90-
->method('getMetadataFactory');
91-
$manager->method('getConfiguration')
92-
->will($this->returnValue($config));
93-
$manager->expects($this->any())
94-
->method('getUnitOfWork')
95-
->will($this->returnValue($unitOfWork));
96-
$unitOfWork->expects($this->any())
97-
->method('getIdentityMap')
98-
->will($this->returnValue([]));
81+
$manager->expects($this->never())->method('getMetadataFactory');
82+
$manager->method('getConfiguration')->willReturn($config);
83+
$manager->method('getUnitOfWork')->willReturn($unitOfWork);
84+
$unitOfWork->method('getIdentityMap')->willReturn([]);
9985

10086
$collector->collect(new Request(), new Response());
10187

@@ -165,19 +151,12 @@ private function createCollector(
165151
bool $shouldValidateSchema = true,
166152
DebugDataHolder|null $debugDataHolder = null,
167153
): DoctrineDataCollector {
168-
$registry = $this->createMock(ManagerRegistry::class);
169-
$registry
170-
->expects($this->any())
171-
->method('getConnectionNames')
172-
->will($this->returnValue(['default' => 'doctrine.dbal.default_connection']));
173-
$registry
174-
->expects($this->any())
175-
->method('getManagerNames')
176-
->will($this->returnValue(['default' => 'doctrine.orm.default_entity_manager']));
177-
$registry
178-
->expects($this->any())
179-
->method('getManagers')
180-
->will($this->returnValue($managers));
154+
$registry = $this->createStub(ManagerRegistry::class);
155+
$registry->method('getConnectionNames')
156+
->willReturn(['default' => 'doctrine.dbal.default_connection']);
157+
$registry->method('getManagerNames')
158+
->willReturn(['default' => 'doctrine.orm.default_entity_manager']);
159+
$registry->method('getManagers')->willReturn($managers);
181160

182161
return new DoctrineDataCollector($registry, $shouldValidateSchema, $debugDataHolder);
183162
}

0 commit comments

Comments
 (0)