Skip to content

Commit 01177b3

Browse files
Fix cloning entities
1 parent 1a5a4c6 commit 01177b3

File tree

3 files changed

+12
-8
lines changed

3 files changed

+12
-8
lines changed

psalm-baseline.xml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1502,7 +1502,9 @@
15021502
<code><![CDATA[__wakeup]]></code>
15031503
</UndefinedInterfaceMethod>
15041504
<UndefinedMethod>
1505-
<code><![CDATA[self::createLazyGhost($initializer, $skippedProperties)]]></code>
1505+
<code><![CDATA[$proxy = self::createLazyGhost(static function (InternalProxy $object) use ($initializer, $identifier): void {
1506+
$initializer($object, $identifier);
1507+
}, $skippedProperties);]]></code>
15061508
</UndefinedMethod>
15071509
<UnresolvableInclude>
15081510
<code><![CDATA[require $fileName]]></code>

src/Proxy/ProxyFactory.php

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -360,9 +360,8 @@ 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) use ($entityPersister, $classMetadata, $identifierFlattener): void {
364-
$identifier = $classMetadata->getIdentifierValues($proxy);
365-
$original = $entityPersister->loadById($identifier);
363+
return static function (InternalProxy $proxy, array $identifier) use ($entityPersister, $classMetadata, $identifierFlattener): void {
364+
$original = $entityPersister->loadById($identifier);
366365

367366
if ($original === null) {
368367
throw EntityNotFoundException::fromClassNameAndIdentifier(
@@ -375,10 +374,11 @@ private function createLazyInitializer(ClassMetadata $classMetadata, EntityPersi
375374
return;
376375
}
377376

378-
$class = $entityPersister->getClassMetadata();
377+
$class = $entityPersister->getClassMetadata();
378+
$identifiers = array_flip($class->getIdentifierFieldNames());
379379

380380
foreach ($class->getReflectionProperties() as $property) {
381-
if (! $class->hasField($property->name) && ! $class->hasAssociation($property->name)) {
381+
if (isset($identifiers[$property->name]) || ! $class->hasField($property->name) && ! $class->hasAssociation($property->name)) {
382382
continue;
383383
}
384384

@@ -468,7 +468,9 @@ 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($initializer, $skippedProperties);
471+
$proxy = self::createLazyGhost(static function (InternalProxy $object) use ($initializer, $identifier): void {
472+
$initializer($object, $identifier);
473+
}, $skippedProperties);
472474

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

tests/Tests/ORM/Functional/ProxiesLikeEntitiesTest.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ protected function setUp(): void
5858
public function testPersistUpdate(): void
5959
{
6060
// Considering case (a)
61-
$proxy = $this->_em->getProxyFactory()->getProxy(CmsUser::class, ['id' => 123]);
61+
$proxy = $this->_em->getProxyFactory()->getProxy(CmsUser::class, ['id' => $this->user->getId()]);
6262

6363
$proxy->id = null;
6464
$proxy->username = 'ocra';

0 commit comments

Comments
 (0)