Skip to content

Commit f9294dd

Browse files
committed
feat: use AfterPersist hook in PersistedObjectsTracker
1 parent 6f0365f commit f9294dd

File tree

7 files changed

+30
-31
lines changed

7 files changed

+30
-31
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: 19 additions & 17 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,48 +24,49 @@ 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-
continue;
43-
}
44-
45-
self::$buffer[$object] = Configuration::instance()->persistence()->getIdentifierValues($object);
44+
if ($event->factory instanceof PersistentProxyObjectFactory || !$event->factory->autorefreshEnabled()) {
45+
return;
4646
}
47+
48+
$this->add($event->object);
4749
}
4850

49-
public static function updateIds(): void
51+
public function add(object ...$objects): void
5052
{
51-
foreach (self::$buffer as $object => $id) {
52-
if ($id) {
53+
foreach ($objects as $object) {
54+
if (self::$trackedObjects->offsetExists($object) && self::$trackedObjects[$object]) {
5355
continue;
5456
}
5557

56-
self::$buffer[$object] = Configuration::instance()->persistence()->getIdentifierValues($object);
58+
self::$trackedObjects[$object] = Configuration::instance()->persistence()->getIdentifierValues($object);
5759
}
5860
}
5961

6062
public static function reset(): void
6163
{
62-
self::$buffer = new \WeakMap();
64+
self::$trackedObjects = new \WeakMap();
6365
}
6466

6567
public static function countObjects(): int
6668
{
67-
return \count(self::$buffer);
69+
return \count(self::$trackedObjects);
6870
}
6971

7072
private static function proxifyObjects(): void
@@ -73,7 +75,7 @@ private static function proxifyObjects(): void
7375
return;
7476
}
7577

76-
foreach (self::$buffer as $object => $id) {
78+
foreach (self::$trackedObjects as $object => $id) {
7779
if (!$id) {
7880
continue;
7981
}

src/Persistence/PersistenceManager.php

Lines changed: 0 additions & 3 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

src/Persistence/PersistentObjectFactory.php

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -316,6 +316,11 @@ final public function withoutAutorefresh(): static
316316
return $clone;
317317
}
318318

319+
final public function autorefreshEnabled(): bool
320+
{
321+
return $this->autorefreshEnabled;
322+
}
323+
319324
/**
320325
* @internal
321326
*/
@@ -528,13 +533,6 @@ static function(object $object, array $parameters, PersistentObjectFactory $fact
528533
return;
529534
}
530535

531-
if (
532-
$factoryUsed->autorefreshEnabled
533-
&& !$factoryUsed instanceof PersistentProxyObjectFactory
534-
) {
535-
Configuration::instance()->persistedObjectsTracker?->add($object);
536-
}
537-
538536
$afterPersistCallbacks = [];
539537

540538
foreach ($factoryUsed->afterPersist as $afterPersist) {

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\Model\GenericModel;

0 commit comments

Comments
 (0)