1111use Patchlevel \Hydrator \Guesser \BuiltInGuesser ;
1212use Patchlevel \Hydrator \Guesser \ChainGuesser ;
1313use Patchlevel \Hydrator \Guesser \Guesser ;
14+ use Patchlevel \Hydrator \Metadata \ArrayCacheMetadataFactory ;
1415use Patchlevel \Hydrator \Metadata \AttributeMetadataFactory ;
1516use Patchlevel \Hydrator \Metadata \ClassMetadata ;
1617use Patchlevel \Hydrator \Metadata \ClassNotFound ;
18+ use Patchlevel \Hydrator \Metadata \HydratorSetterMetadataFactory ;
1719use Patchlevel \Hydrator \Metadata \MetadataFactory ;
18- use Patchlevel \Hydrator \Normalizer \HydratorAwareNormalizer ;
1920use ReflectionClass ;
2021use ReflectionParameter ;
2122use Symfony \Component \EventDispatcher \EventDispatcher ;
@@ -35,12 +36,21 @@ final class MetadataHydrator implements Hydrator
3536 /** @var array<int, class-string> */
3637 private array $ stack = [];
3738
39+ private readonly MetadataFactory $ metadataFactory ;
40+
3841 public function __construct (
39- private readonly MetadataFactory $ metadataFactory = new AttributeMetadataFactory (),
42+ MetadataFactory $ metadataFactory = new AttributeMetadataFactory (),
4043 PayloadCryptographer |null $ cryptographer = null ,
4144 private EventDispatcherInterface |null $ eventDispatcher = null ,
4245 private readonly bool $ defaultLazy = false ,
4346 ) {
47+ $ this ->metadataFactory = new ArrayCacheMetadataFactory (
48+ new HydratorSetterMetadataFactory (
49+ $ this ,
50+ $ metadataFactory ,
51+ ),
52+ );
53+
4454 if (!$ cryptographer ) {
4555 return ;
4656 }
@@ -132,10 +142,6 @@ private function doHydrate(ClassMetadata $metadata, array $data): object
132142 $ normalizer = $ propertyMetadata ->normalizer ;
133143
134144 if ($ normalizer ) {
135- if ($ normalizer instanceof HydratorAwareNormalizer) {
136- $ normalizer ->setHydrator ($ this );
137- }
138-
139145 try {
140146 /** @psalm-suppress MixedAssignment */
141147 $ value = $ normalizer ->denormalize ($ value );
@@ -197,10 +203,6 @@ public function extract(object $object): array
197203 $ normalizer = $ propertyMetadata ->normalizer ;
198204
199205 if ($ normalizer ) {
200- if ($ normalizer instanceof HydratorAwareNormalizer) {
201- $ normalizer ->setHydrator ($ this );
202- }
203-
204206 try {
205207 /** @psalm-suppress MixedAssignment */
206208 $ value = $ normalizer ->normalize ($ value );
0 commit comments