Skip to content

Commit 9d1a497

Browse files
Improve lazy ghost performance by avoiding self-referencing closure. (#11376)
* Improve lazy ghost performance by avoiding self-referencing closure. Co-authored-by: Nicolas Grekas <[email protected]> * update baselien --------- Co-authored-by: Nicolas Grekas <[email protected]>
1 parent 40a0964 commit 9d1a497

File tree

3 files changed

+11
-17
lines changed

3 files changed

+11
-17
lines changed

psalm-baseline.xml

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1492,6 +1492,7 @@
14921492
<code><![CDATA[getValue]]></code>
14931493
<code><![CDATA[setAccessible]]></code>
14941494
<code><![CDATA[setValue]]></code>
1495+
<code><![CDATA[setValue]]></code>
14951496
</PossiblyNullReference>
14961497
<TypeDoesNotContainType>
14971498
<code><![CDATA[$autoGenerate < 0]]></code>
@@ -1501,13 +1502,8 @@
15011502
<code><![CDATA[__wakeup]]></code>
15021503
</UndefinedInterfaceMethod>
15031504
<UndefinedMethod>
1504-
<code><![CDATA[self::createLazyGhost(static function (InternalProxy $object) use ($initializer, &$proxy): void {
1505-
$initializer($object, $proxy);
1506-
}, $skippedProperties)]]></code>
1505+
<code><![CDATA[self::createLazyGhost($initializer, $skippedProperties)]]></code>
15071506
</UndefinedMethod>
1508-
<UndefinedVariable>
1509-
<code><![CDATA[$proxy]]></code>
1510-
</UndefinedVariable>
15111507
<UnresolvableInclude>
15121508
<code><![CDATA[require $fileName]]></code>
15131509
</UnresolvableInclude>

src/Proxy/ProxyFactory.php

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -360,11 +360,11 @@ private function createInitializer(ClassMetadata $classMetadata, EntityPersister
360360
*/
361361
private function createLazyInitializer(ClassMetadata $classMetadata, EntityPersister $entityPersister, IdentifierFlattener $identifierFlattener): Closure
362362
{
363-
return static function (InternalProxy $proxy, InternalProxy $original) use ($entityPersister, $classMetadata, $identifierFlattener): void {
364-
$identifier = $classMetadata->getIdentifierValues($original);
365-
$entity = $entityPersister->loadById($identifier, $original);
363+
return static function (InternalProxy $proxy) use ($entityPersister, $classMetadata, $identifierFlattener): void {
364+
$identifier = $classMetadata->getIdentifierValues($proxy);
365+
$original = $entityPersister->loadById($identifier);
366366

367-
if ($entity === null) {
367+
if ($original === null) {
368368
throw EntityNotFoundException::fromClassNameAndIdentifier(
369369
$classMetadata->getName(),
370370
$identifierFlattener->flattenIdentifier($classMetadata, $identifier)
@@ -382,7 +382,7 @@ private function createLazyInitializer(ClassMetadata $classMetadata, EntityPersi
382382
continue;
383383
}
384384

385-
$property->setValue($proxy, $property->getValue($entity));
385+
$property->setValue($proxy, $property->getValue($original));
386386
}
387387
};
388388
}
@@ -468,9 +468,7 @@ private function getProxyFactory(string $className): Closure
468468
$identifierFields = array_intersect_key($class->getReflectionProperties(), $identifiers);
469469

470470
$proxyFactory = Closure::bind(static function (array $identifier) use ($initializer, $skippedProperties, $identifierFields, $className): InternalProxy {
471-
$proxy = self::createLazyGhost(static function (InternalProxy $object) use ($initializer, &$proxy): void {
472-
$initializer($object, $proxy);
473-
}, $skippedProperties);
471+
$proxy = self::createLazyGhost($initializer, $skippedProperties);
474472

475473
foreach ($identifierFields as $idField => $reflector) {
476474
if (! isset($identifier[$idField])) {

tests/Tests/ORM/Proxy/ProxyFactoryTest.php

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ public function testReferenceProxyDelegatesLoadingToThePersister(): void
6565
{
6666
$identifier = ['id' => 42];
6767
$proxyClass = 'Proxies\__CG__\Doctrine\Tests\Models\ECommerce\ECommerceFeature';
68-
$persister = $this->getMockBuilderWithOnlyMethods(BasicEntityPersister::class, ['load'])
68+
$persister = $this->getMockBuilderWithOnlyMethods(BasicEntityPersister::class, ['loadById'])
6969
->disableOriginalConstructor()
7070
->getMock();
7171

@@ -75,8 +75,8 @@ public function testReferenceProxyDelegatesLoadingToThePersister(): void
7575

7676
$persister
7777
->expects(self::atLeastOnce())
78-
->method('load')
79-
->with(self::equalTo($identifier), self::isInstanceOf($proxyClass))
78+
->method('loadById')
79+
->with(self::equalTo($identifier))
8080
->will(self::returnValue($proxy));
8181

8282
$proxy->getDescription();

0 commit comments

Comments
 (0)