2121use Zenstruck \Foundry \FactoryCollection ;
2222use Zenstruck \Foundry \Object \Hydrator ;
2323use Zenstruck \Foundry \ObjectFactory ;
24+ use Zenstruck \Foundry \Persistence \Event \AfterPersist ;
2425use Zenstruck \Foundry \Persistence \Exception \NotEnoughObjects ;
2526use Zenstruck \Foundry \Persistence \Exception \RefreshObjectFailed ;
2627use Zenstruck \Foundry \Persistence \Relationship \ManyToOneRelationship ;
@@ -507,10 +508,13 @@ protected function normalizeObject(string $field, object $object): object
507508 }
508509 }
509510
511+ /**
512+ * @internal
513+ */
510514 final protected function initializeInternal (): static
511515 {
512516 // Schedule any new object for insert right after instantiation
513- return parent ::initializeInternal ()
517+ $ factory = parent ::initializeInternal ()
514518 ->afterInstantiate (
515519 static function (object $ object , array $ parameters , PersistentObjectFactory $ factoryUsed ): void {
516520 if (!$ factoryUsed ->isPersisting ()) {
@@ -537,6 +541,20 @@ static function(object $object, array $parameters, PersistentObjectFactory $fact
537541 }
538542 )
539543 ;
544+
545+ if (!Configuration::isBooted () || !Configuration::instance ()->hasEventDispatcher ()) {
546+ return $ factory ;
547+ }
548+
549+ return $ factory ->afterPersist (
550+ static function (object $ object , array $ parameters , self $ factoryUsed ): bool {
551+ Configuration::instance ()->eventDispatcher ()->dispatch (
552+ new AfterPersist ($ object , $ parameters , $ factoryUsed )
553+ );
554+
555+ return false ; // don't perform a flush after the hook
556+ }
557+ );
540558 }
541559
542560 private function isAutorefreshEnabled (): bool
0 commit comments