@@ -23,12 +23,15 @@ final class MetadataHydrator implements Hydrator
2323 /** @var array<class-string, ClassMetadata> */
2424 private array $ classMetadata = [];
2525
26+ private readonly Stack $ stack ;
27+
2628 /** @param list<Middleware> $middlewares */
2729 public function __construct (
2830 private readonly MetadataFactory $ metadataFactory = new AttributeMetadataFactory (),
2931 private readonly array $ middlewares = [new TransformMiddleware ()],
3032 private readonly bool $ defaultLazy = false ,
3133 ) {
34+ $ this ->stack = new Stack ($ this ->middlewares );
3235 }
3336
3437 /**
@@ -48,23 +51,21 @@ public function hydrate(string $class, array $data, array $context = []): object
4851 throw new ClassNotSupported ($ class , $ e );
4952 }
5053
51- if (PHP_VERSION_ID < 80400 ) {
52- $ stack = new Stack ($ this ->middlewares );
54+ $ stack = clone $ this ->stack ;
5355
56+ if (PHP_VERSION_ID < 80400 ) {
5457 return $ stack ->next ()->hydrate ($ metadata , $ data , $ context , $ stack );
5558 }
5659
5760 $ lazy = $ metadata ->lazy ?? $ this ->defaultLazy ;
5861
5962 if (!$ lazy ) {
60- $ stack = new Stack ($ this ->middlewares );
61-
6263 return $ stack ->next ()->hydrate ($ metadata , $ data , $ context , $ stack );
6364 }
6465
6566 return (new ReflectionClass ($ class ))->newLazyProxy (
6667 function () use ($ metadata , $ data , $ context ): object {
67- $ stack = new Stack ( $ this ->middlewares ) ;
68+ $ stack = clone $ this ->stack ;
6869
6970 return $ stack ->next ()->hydrate ($ metadata , $ data , $ context , $ stack );
7071 },
@@ -79,7 +80,7 @@ function () use ($metadata, $data, $context): object {
7980 public function extract (object $ object , array $ context = []): array
8081 {
8182 $ metadata = $ this ->metadata ($ object ::class);
82- $ stack = new Stack ( $ this ->middlewares ) ;
83+ $ stack = clone $ this ->stack ;
8384
8485 return $ stack ->next ()->extract ($ metadata , $ object , $ context , $ stack );
8586 }
@@ -93,18 +94,18 @@ public function extract(object $object, array $context = []): array
9394 */
9495 public function metadata (string $ class ): ClassMetadata
9596 {
96- if (array_key_exists ( $ class , $ this ->classMetadata )) {
97+ if (isset ( $ this ->classMetadata [ $ class ] )) {
9798 return $ this ->classMetadata [$ class ];
9899 }
99100
100101 $ this ->classMetadata [$ class ] = $ metadata = $ this ->metadataFactory ->metadata ($ class );
101102
102103 foreach ($ metadata ->properties as $ property ) {
103- if (!($ property ->normalizer instanceof HydratorAwareNormalizer)) {
104- continue ;
105- }
104+ $ normalizer = $ property ->normalizer ;
106105
107- $ property ->normalizer ->setHydrator ($ this );
106+ if ($ normalizer instanceof HydratorAwareNormalizer) {
107+ $ normalizer ->setHydrator ($ this );
108+ }
108109 }
109110
110111 return $ metadata ;
0 commit comments