Skip to content

Commit 4427c3f

Browse files
authored
Merge pull request doctrine#2031 from doctrine/2.16.x-merge-up-into-2.17.x_b0EsZrIi
Merge release 2.16.2 into 2.17.x
2 parents 2bc7984 + 1c10de0 commit 4427c3f

12 files changed

Lines changed: 134 additions & 216 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,67 +27,74 @@
2727
*/
2828
class EntityListenerPass implements CompilerPassInterface
2929
{
30-
use PriorityTaggedServiceTrait;
31-
3230
/** @return void */
3331
public function process(ContainerBuilder $container)
3432
{
35-
$resolvers = $this->findAndSortTaggedServices('doctrine.orm.entity_listener', $container);
36-
3733
$lazyServiceReferencesByResolver = [];
3834

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

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

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

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

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

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

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

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

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

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

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

84-
$lazyServiceReferencesByResolver[$resolverId][$id] = new Reference($id);
85-
} else {
86-
$listener->setPublic(true);
86+
// if the resolver uses the default class we will use a service locator for all listeners
87+
if ($resolverClass === ContainerEntityListenerResolver::class) {
88+
if (! isset($lazyServiceReferencesByResolver[$resolverId])) {
89+
$lazyServiceReferencesByResolver[$resolverId] = [];
8790
}
91+
92+
$lazyServiceReferencesByResolver[$resolverId][$id] = new Reference($id);
8893
} else {
89-
$resolver->addMethodCall('register', [new Reference($id)]);
94+
$listener->setPublic(true);
9095
}
96+
} else {
97+
$resolver->addMethodCall('register', [new Reference($id)]);
9198
}
9299
}
93100

src/DependencyInjection/Configuration.php

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@
2525
use function array_key_exists;
2626
use function array_keys;
2727
use function array_pop;
28-
use function assert;
2928
use function class_exists;
3029
use function constant;
3130
use function count;
@@ -66,9 +65,7 @@ public function getConfigTreeBuilder(): TreeBuilder
6665
$treeBuilder = new TreeBuilder('doctrine');
6766
$rootNode = $treeBuilder->getRootNode();
6867

69-
/* @phpstan-ignore argument.type (symfony plugin needed) */
7068
$this->addDbalSection($rootNode);
71-
/* @phpstan-ignore argument.type (symfony plugin needed) */
7269
$this->addOrmSection($rootNode);
7370

7471
return $treeBuilder;
@@ -185,7 +182,6 @@ private function getDbalConnectionsNode(): ArrayNodeDefinition
185182
->requiresAtLeastOneElement()
186183
->useAttributeAsKey('name')
187184
->prototype('array');
188-
assert($connectionNode instanceof ArrayNodeDefinition);
189185

190186
$this->configureDbalDriverNode($connectionNode);
191187

@@ -267,7 +263,6 @@ private function getDbalConnectionsNode(): ArrayNodeDefinition
267263
)
268264
->useAttributeAsKey('name')
269265
->prototype('array');
270-
/* @phpstan-ignore argument.type (symfony plugin needed) */
271266
$this->configureDbalDriverNode($slaveNode);
272267

273268
// dbal >= 2.11
@@ -276,11 +271,8 @@ private function getDbalConnectionsNode(): ArrayNodeDefinition
276271
->arrayNode('replicas')
277272
->useAttributeAsKey('name')
278273
->prototype('array');
279-
/* @phpstan-ignore argument.type (symfony plugin needed) */
280274
$this->configureDbalDriverNode($replicaNode);
281275

282-
assert($node instanceof ArrayNodeDefinition);
283-
284276
return $node;
285277
}
286278

@@ -834,8 +826,6 @@ private function getOrmEntityManagersNode(): ArrayNodeDefinition
834826
->end()
835827
->end();
836828

837-
assert($node instanceof ArrayNodeDefinition);
838-
839829
return $node;
840830
}
841831

@@ -862,8 +852,6 @@ private function getOrmCacheDriverNode(string $name): ArrayNodeDefinition
862852
$node->addDefaultsIfNotSet();
863853
}
864854

865-
assert($node instanceof ArrayNodeDefinition);
866-
867855
return $node;
868856
}
869857

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/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)