Skip to content

Commit 3c326b3

Browse files
committed
feat: use AfterPersist hook in PersistedObjectsTracker
1 parent 896f22c commit 3c326b3

File tree

7 files changed

+31
-35
lines changed

7 files changed

+31
-35
lines changed

config/persistence.php

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,9 @@
66
use Symfony\Component\HttpKernel\Event\TerminateEvent;
77
use Symfony\Component\Messenger\Event\WorkerMessageHandledEvent;
88
use Zenstruck\Foundry\Command\LoadFixturesCommand;
9+
use Zenstruck\Foundry\Persistence\Event\AfterPersist;
910
use Zenstruck\Foundry\Persistence\PersistenceManager;
10-
use Zenstruck\Foundry\Persistence\Proxy\PersistedObjectsTracker;
11+
use Zenstruck\Foundry\Persistence\PersistedObjectsTracker;
1112
use Zenstruck\Foundry\Persistence\ResetDatabase\ResetDatabaseManager;
1213

1314
return static function (ContainerConfigurator $container): void {
@@ -38,6 +39,7 @@
3839
->tag('kernel.event_listener', ['event' => TerminateEvent::class, 'method' => 'refresh'])
3940
->tag('kernel.event_listener', ['event' => ConsoleTerminateEvent::class, 'method' => 'refresh'])
4041
->tag('kernel.event_listener', ['event' => WorkerMessageHandledEvent::class, 'method' => 'refresh']) // @phpstan-ignore class.notFound
42+
->tag('foundry.hook', ['class' => null, 'method' => 'afterPersistHook', 'event' => AfterPersist::class])
4143
;
4244
}
4345
};

src/Configuration.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
use Zenstruck\Foundry\InMemory\CannotEnableInMemory;
2121
use Zenstruck\Foundry\InMemory\InMemoryRepositoryRegistry;
2222
use Zenstruck\Foundry\Persistence\PersistenceManager;
23-
use Zenstruck\Foundry\Persistence\Proxy\PersistedObjectsTracker;
23+
use Zenstruck\Foundry\Persistence\PersistedObjectsTracker;
2424

2525
/**
2626
* @author Kevin Bond <kevinbond@gmail.com>

src/Persistence/Proxy/PersistedObjectsTracker.php renamed to src/Persistence/PersistedObjectsTracker.php

Lines changed: 21 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,10 @@
99
* file that was distributed with this source code.
1010
*/
1111

12-
namespace Zenstruck\Foundry\Persistence\Proxy;
12+
namespace Zenstruck\Foundry\Persistence;
1313

1414
use Zenstruck\Foundry\Configuration;
15+
use Zenstruck\Foundry\Persistence\Event\AfterPersist;
1516

1617
/**
1718
* @internal
@@ -23,50 +24,51 @@ final class PersistedObjectsTracker
2324
*
2425
* @var \WeakMap<object, mixed> keys: objects, values: value ids
2526
*/
26-
private static \WeakMap $buffer;
27+
private static \WeakMap $trackedObjects;
2728

2829
public function __construct()
2930
{
30-
self::$buffer ??= new \WeakMap();
31+
self::$trackedObjects ??= new \WeakMap();
3132
}
3233

3334
public function refresh(): void
3435
{
3536
self::proxifyObjects();
3637
}
3738

38-
public function add(object ...$objects): void
39+
/**
40+
* @param AfterPersist<object> $event
41+
*/
42+
public function afterPersistHook(AfterPersist $event): void
3943
{
40-
foreach ($objects as $object) {
41-
if (self::$buffer->offsetExists($object) && self::$buffer[$object]) {
42-
self::proxifyObject($object, self::$buffer[$object]);
43-
44-
continue;
45-
}
46-
47-
self::$buffer[$object] = Configuration::instance()->persistence()->getIdentifierValues($object);
44+
if ($event->factory instanceof PersistentProxyObjectFactory || !$event->factory->isAutorefreshEnabled()) {
45+
return;
4846
}
47+
48+
$this->add($event->object);
4949
}
5050

51-
public static function updateIds(): void
51+
public function add(object ...$objects): void
5252
{
53-
foreach (self::$buffer as $object => $id) {
54-
if ($id) {
53+
foreach ($objects as $object) {
54+
if (self::$trackedObjects->offsetExists($object) && self::$trackedObjects[$object]) {
55+
self::proxifyObject($object, self::$trackedObjects[$object]);
56+
5557
continue;
5658
}
5759

58-
self::$buffer[$object] = Configuration::instance()->persistence()->getIdentifierValues($object);
60+
self::$trackedObjects[$object] = Configuration::instance()->persistence()->getIdentifierValues($object);
5961
}
6062
}
6163

6264
public static function reset(): void
6365
{
64-
self::$buffer = new \WeakMap();
66+
self::$trackedObjects = new \WeakMap();
6567
}
6668

6769
public static function countObjects(): int
6870
{
69-
return \count(self::$buffer);
71+
return \count(self::$trackedObjects);
7072
}
7173

7274
private static function proxifyObjects(): void
@@ -75,7 +77,7 @@ private static function proxifyObjects(): void
7577
return;
7678
}
7779

78-
foreach (self::$buffer as $object => $id) {
80+
foreach (self::$trackedObjects as $object => $id) {
7981
if (!$id) {
8082
continue;
8183
}

src/Persistence/PersistenceManager.php

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@
2222
use Zenstruck\Foundry\Persistence\Exception\ObjectHasUnsavedChanges;
2323
use Zenstruck\Foundry\Persistence\Exception\ObjectNoLongerExist;
2424
use Zenstruck\Foundry\Persistence\Exception\RefreshObjectFailed;
25-
use Zenstruck\Foundry\Persistence\Proxy\PersistedObjectsTracker;
2625
use Zenstruck\Foundry\Persistence\Relationship\RelationshipMetadata;
2726
use Zenstruck\Foundry\Persistence\ResetDatabase\ResetDatabaseManager;
2827

@@ -86,8 +85,6 @@ public function save(object $object): object
8685
$this->flush($om);
8786
}
8887

89-
PersistedObjectsTracker::updateIds();
90-
9188
return $object;
9289
}
9390

@@ -426,7 +423,6 @@ private function flushAllStrategies(): void
426423
$this->flush($om);
427424
}
428425
}
429-
PersistedObjectsTracker::updateIds();
430426
}
431427

432428
/**

src/Persistence/PersistentObjectFactory.php

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -521,13 +521,6 @@ static function(object $object, array $parameters, PersistentObjectFactory $fact
521521
return;
522522
}
523523

524-
if (
525-
$factoryUsed->isAutorefreshEnabled()
526-
&& !$factoryUsed instanceof PersistentProxyObjectFactory
527-
) {
528-
Configuration::instance()->persistedObjectsTracker?->add($object);
529-
}
530-
531524
$afterPersistCallbacks = [];
532525

533526
foreach ($factoryUsed->afterPersist as $afterPersist) {
@@ -557,7 +550,10 @@ static function(object $object, array $parameters, self $factoryUsed): bool {
557550
);
558551
}
559552

560-
private function isAutorefreshEnabled(): bool
553+
/**
554+
* @internal
555+
*/
556+
public function isAutorefreshEnabled(): bool
561557
{
562558
return $this->autorefreshEnabled ??= Configuration::autoRefreshWithLazyObjectsIsEnabled();
563559
}

tests/Integration/ORM/AutoRefreshTest.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
use PHPUnit\Framework\Attributes\Test;
2424
use Zenstruck\Foundry\Configuration;
2525
use Zenstruck\Foundry\Persistence\PersistentObjectFactory;
26-
use Zenstruck\Foundry\Persistence\Proxy\PersistedObjectsTracker;
26+
use Zenstruck\Foundry\Persistence\PersistedObjectsTracker;
2727
use Zenstruck\Foundry\Tests\Fixture\DoctrineCascadeRelationship\ChangesEntityRelationshipCascadePersist;
2828
use Zenstruck\Foundry\Tests\Fixture\DoctrineCascadeRelationship\UsingRelationships;
2929
use Zenstruck\Foundry\Tests\Fixture\Entity\Contact;

tests/Integration/Persistence/AutoRefreshTestCase.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525
use Symfony\Component\HttpKernel\KernelInterface;
2626
use Zenstruck\Foundry\Configuration;
2727
use Zenstruck\Foundry\Persistence\PersistentObjectFactory;
28-
use Zenstruck\Foundry\Persistence\Proxy\PersistedObjectsTracker;
28+
use Zenstruck\Foundry\Persistence\PersistedObjectsTracker;
2929
use Zenstruck\Foundry\Test\Factories;
3030
use Zenstruck\Foundry\Test\ResetDatabase;
3131
use Zenstruck\Foundry\Tests\Fixture\Document\DocumentWithReadonly;

0 commit comments

Comments
 (0)