4545use Patchlevel \EventSourcing \Console \Command \WatchCommand ;
4646use Patchlevel \EventSourcing \Console \DoctrineHelper ;
4747use Patchlevel \EventSourcing \Cryptography \DoctrineCipherKeyStore ;
48+ use Patchlevel \EventSourcing \Cryptography \ExtensionDoctrineCipherKeyStore ;
4849use Patchlevel \EventSourcing \EventBus \AttributeListenerProvider ;
4950use Patchlevel \EventSourcing \EventBus \Consumer ;
5051use Patchlevel \EventSourcing \EventBus \DefaultConsumer ;
126127use Patchlevel \EventSourcingBundle \DataCollector \MessageCollectorEventBus ;
127128use Patchlevel \EventSourcingBundle \Doctrine \DbalConnectionFactory ;
128129use Patchlevel \EventSourcingBundle \EventBus \SymfonyEventBus ;
130+ use Patchlevel \EventSourcingBundle \Normalizer \SymfonyExtension ;
129131use Patchlevel \EventSourcingBundle \Normalizer \SymfonyGuesser ;
130132use Patchlevel \EventSourcingBundle \QueryBus \SymfonyQueryBus ;
131133use Patchlevel \EventSourcingBundle \RequestListener \AutoSetupListener ;
134136use Patchlevel \EventSourcingBundle \Subscription \ResetServicesListener ;
135137use Patchlevel \EventSourcingBundle \Subscription \StaticInMemorySubscriptionStoreFactory ;
136138use Patchlevel \EventSourcingBundle \ValueResolver \AggregateRootIdValueResolver ;
139+ use Patchlevel \Hydrator \CoreExtension ;
137140use Patchlevel \Hydrator \Cryptography \Cipher \Cipher ;
138141use Patchlevel \Hydrator \Cryptography \Cipher \CipherKeyFactory ;
139142use Patchlevel \Hydrator \Cryptography \Cipher \OpensslCipher ;
140143use Patchlevel \Hydrator \Cryptography \Cipher \OpensslCipherKeyFactory ;
141144use Patchlevel \Hydrator \Cryptography \PayloadCryptographer ;
142145use Patchlevel \Hydrator \Cryptography \PersonalDataPayloadCryptographer ;
143146use Patchlevel \Hydrator \Cryptography \Store \CipherKeyStore ;
147+ use Patchlevel \Hydrator \Extension as HydratorExtension ;
148+ use Patchlevel \Hydrator \Extension \Cryptography \BaseCryptographer ;
149+ use Patchlevel \Hydrator \Extension \Cryptography \Cryptographer ;
150+ use Patchlevel \Hydrator \Extension \Cryptography \CryptographyExtension ;
151+ use Patchlevel \Hydrator \Extension \Lifecycle \LifecycleExtension ;
144152use Patchlevel \Hydrator \Guesser \BuiltInGuesser ;
145153use Patchlevel \Hydrator \Guesser \ChainGuesser ;
146154use Patchlevel \Hydrator \Guesser \Guesser ;
147155use Patchlevel \Hydrator \Hydrator ;
148156use Patchlevel \Hydrator \Metadata \AttributeMetadataFactory ;
149157use Patchlevel \Hydrator \Metadata \MetadataFactory ;
150158use Patchlevel \Hydrator \MetadataHydrator ;
159+ use Patchlevel \Hydrator \StackHydrator ;
160+ use Patchlevel \Hydrator \StackHydratorBuilder ;
151161use Patchlevel \Worker \Event \WorkerRunningEvent ;
152162use Symfony \Component \DependencyInjection \Argument \TaggedIteratorArgument ;
153163use Symfony \Component \DependencyInjection \ChildDefinition ;
156166use Symfony \Component \DependencyInjection \Exception \InvalidArgumentException ;
157167use Symfony \Component \DependencyInjection \Extension \Extension ;
158168use Symfony \Component \DependencyInjection \Reference ;
159-
160169use function class_exists ;
161170use function sprintf ;
162171
@@ -177,7 +186,7 @@ public function load(array $configs, ContainerBuilder $container): void
177186 return ;
178187 }
179188
180- $ this ->configureHydrator ($ container );
189+ $ this ->configureHydrator ($ config , $ container );
181190 $ this ->configureUpcaster ($ container );
182191 $ this ->configureSerializer ($ config , $ container );
183192 $ this ->configureMessageDecorator ($ container );
@@ -622,38 +631,93 @@ static function (ChildDefinition $definition): void {
622631 ]);
623632 }
624633
625- private function configureHydrator (ContainerBuilder $ container ): void
634+ /** @param Config $config */
635+ private function configureHydrator (array $ config , ContainerBuilder $ container ): void
626636 {
627- $ container ->register (ChainGuesser::class)
628- ->setArguments ([new TaggedIteratorArgument ('event_sourcing.hydrator.guesser ' )]);
637+ if (!$ config ['hydrator ' ]['enabled ' ]) { // legacy MetadataHydrator
638+ $ container ->register (ChainGuesser::class)
639+ ->setArguments ([new TaggedIteratorArgument ('event_sourcing.hydrator.guesser ' )]);
629640
630- $ container ->register (BuiltInGuesser::class)
631- ->addTag ('event_sourcing.hydrator.guesser ' , ['priority ' => -100 ]);
641+ $ container ->register (BuiltInGuesser::class)
642+ ->addTag ('event_sourcing.hydrator.guesser ' , ['priority ' => -64 ]);
632643
633- $ container ->register (SymfonyGuesser::class)
634- ->addTag ('event_sourcing.hydrator.guesser ' , ['priority ' => -50 ]);
644+ $ container ->register (SymfonyGuesser::class)
645+ ->addTag ('event_sourcing.hydrator.guesser ' , ['priority ' => -32 ]);
635646
636- $ container ->registerForAutoconfiguration (Guesser::class)
637- ->addTag ('event_sourcing.hydrator.guesser ' );
647+ $ container ->registerForAutoconfiguration (Guesser::class)
648+ ->addTag ('event_sourcing.hydrator.guesser ' );
638649
639- $ container ->register (AttributeMetadataFactory::class)
640- ->setArguments ([
641- null ,
642- new Reference (ChainGuesser::class),
643- ]);
650+ $ container ->register (AttributeMetadataFactory::class)
651+ ->setArguments ([
652+ null ,
653+ new Reference (ChainGuesser::class),
654+ ]);
644655
645- $ container ->setAlias (MetadataFactory::class, AttributeMetadataFactory::class);
656+ $ container ->setAlias (MetadataFactory::class, AttributeMetadataFactory::class);
646657
647- $ container ->register (MetadataHydrator::class)
648- ->setArguments ([
649- new Reference (MetadataFactory::class),
650- new Reference (
651- PayloadCryptographer::class,
652- ContainerInterface::IGNORE_ON_INVALID_REFERENCE ,
653- ),
654- ]);
658+ $ container ->register (MetadataHydrator::class)
659+ ->setArguments ([
660+ new Reference (MetadataFactory::class),
661+ new Reference (
662+ PayloadCryptographer::class,
663+ ContainerInterface::IGNORE_ON_INVALID_REFERENCE ,
664+ ),
665+ ]);
666+
667+ $ container ->setAlias (Hydrator::class, MetadataHydrator::class);
668+
669+ return ;
670+ }
671+
672+ $ container ->registerForAutoconfiguration (HydratorExtension::class)
673+ ->addTag ('event_sourcing.hydrator.extension ' );
674+
675+ $ container ->register (CoreExtension::class)
676+ ->addTag ('event_sourcing.hydrator.extension ' );
677+
678+ $ container ->register (SymfonyExtension::class)
679+ ->addTag ('event_sourcing.hydrator.extension ' );
680+
681+ if ($ config ['hydrator ' ]['cryptography ' ]['enabled ' ]) {
682+ $ container ->register (ExtensionDoctrineCipherKeyStore::class)
683+ ->setArguments ([new Reference ('event_sourcing.dbal_connection ' )])
684+ ->addTag ('event_sourcing.doctrine_schema_configurator ' );
685+
686+ $ container ->setAlias (
687+ \Patchlevel \Hydrator \Extension \Cryptography \Store \CipherKeyStore::class,
688+ ExtensionDoctrineCipherKeyStore::class,
689+ );
690+
691+ $ container ->register (BaseCryptographer::class)
692+ ->setFactory ([BaseCryptographer::class, 'createWithOpenssl ' ])
693+ ->setArguments ([
694+ new Reference (\Patchlevel \Hydrator \Extension \Cryptography \Store \CipherKeyStore::class),
695+ $ config ['hydrator ' ]['cryptography ' ]['algorithm ' ],
696+ ]);
697+
698+ $ container ->setAlias (Cryptographer::class, BaseCryptographer::class);
699+
700+ $ container ->register (CryptographyExtension::class)
701+ ->setArguments ([
702+ new Reference (Cryptographer::class),
703+ new Reference (PayloadCryptographer::class, ContainerInterface::IGNORE_ON_INVALID_REFERENCE ),
704+ true ,
705+ ])
706+ ->addTag ('event_sourcing.hydrator.extension ' );
707+ }
708+
709+ if ($ config ['hydrator ' ]['lifecycle ' ]['enabled ' ]) {
710+ $ container ->register (LifecycleExtension::class)
711+ ->addTag ('event_sourcing.hydrator.extension ' );
712+ }
713+
714+ $ builder = $ container ->register (StackHydratorBuilder::class);
715+ $ builder ->addMethodCall ('enableDefaultLazy ' , [$ config ['hydrator ' ]['default_lazy ' ]]);
716+
717+ $ container ->register (StackHydrator::class)
718+ ->setFactory ([new Reference (StackHydratorBuilder::class), 'build ' ]);
655719
656- $ container ->setAlias (Hydrator::class, MetadataHydrator ::class);
720+ $ container ->setAlias (Hydrator::class, StackHydrator ::class);
657721 }
658722
659723 private function configureUpcaster (ContainerBuilder $ container ): void
0 commit comments