@@ -34,53 +34,88 @@ public function hydrate(ClassMetadata $metadata, array $data, array $context, St
3434 {
3535 $ object = $ metadata ->newInstance ();
3636
37- $ constructorParameters = null ;
37+ foreach ($ metadata ->propertiesWithoutNormalizer as $ propertyMetadata ) {
38+ $ fieldName = $ propertyMetadata ->fieldName ;
3839
39- foreach ($ metadata ->properties as $ propertyMetadata ) {
40- if (!array_key_exists ($ propertyMetadata ->fieldName , $ data )) {
40+ if (!isset ($ data [$ fieldName ]) && !array_key_exists ($ fieldName , $ data )) {
4141 if (!$ propertyMetadata ->reflection ->isPromoted ()) {
42- continue ;
42+ goto next_without_normalizer ;
4343 }
4444
45- $ constructorParameters ?? = $ metadata ->promotedConstructorDefaults ();
45+ $ constructorParameters = $ metadata ->promotedConstructorDefaults ();
4646
47- if (!array_key_exists ( $ propertyMetadata ->propertyName , $ constructorParameters )) {
48- continue ;
47+ if (!isset ( $ constructorParameters [ $ propertyMetadata ->propertyName ] )) {
48+ goto next_without_normalizer ;
4949 }
5050
51- $ propertyMetadata ->setValue (
51+ $ propertyMetadata ->reflection -> setValue (
5252 $ object ,
5353 $ constructorParameters [$ propertyMetadata ->propertyName ]->getDefaultValue (),
5454 );
5555
56- continue ;
56+ goto next_without_normalizer ;
5757 }
5858
59- if ($ propertyMetadata ->normalizer ) {
60- try {
61- /** @psalm-suppress MixedAssignment */
62- $ value = $ propertyMetadata ->normalizer ->denormalize ($ data [$ propertyMetadata ->fieldName ], $ context );
63- } catch (Throwable $ e ) {
64- throw new DenormalizationFailure (
65- $ metadata ->className ,
66- $ propertyMetadata ->propertyName ,
67- $ propertyMetadata ->normalizer ::class,
68- $ e ,
69- );
59+ try {
60+ $ propertyMetadata ->reflection ->setValue ($ object , $ data [$ fieldName ]);
61+ } catch (TypeError $ e ) {
62+ throw new TypeMismatch (
63+ $ metadata ->className ,
64+ $ propertyMetadata ->propertyName ,
65+ $ e ,
66+ );
67+ }
68+
69+ next_without_normalizer:
70+ }
71+
72+ foreach ($ metadata ->propertiesWithNormalizer as $ propertyMetadata ) {
73+ $ fieldName = $ propertyMetadata ->fieldName ;
74+
75+ if (!isset ($ data [$ fieldName ]) && !array_key_exists ($ fieldName , $ data )) {
76+ if (!$ propertyMetadata ->reflection ->isPromoted ()) {
77+ goto next_with_normalizer;
78+ }
79+
80+ $ constructorParameters = $ metadata ->promotedConstructorDefaults ();
81+
82+ if (!isset ($ constructorParameters [$ propertyMetadata ->propertyName ])) {
83+ goto next_with_normalizer;
7084 }
71- } else {
72- $ value = $ data [$ propertyMetadata ->fieldName ];
85+
86+ $ propertyMetadata ->reflection ->setValue (
87+ $ object ,
88+ $ constructorParameters [$ propertyMetadata ->propertyName ]->getDefaultValue (),
89+ );
90+
91+ goto next_with_normalizer;
92+ }
93+
94+ $ normalizer = $ propertyMetadata ->normalizer ;
95+
96+ try {
97+ /** @psalm-suppress MixedAssignment */
98+ $ value = $ normalizer ->denormalize ($ data [$ fieldName ], $ context );
99+ } catch (Throwable $ e ) {
100+ throw new DenormalizationFailure (
101+ $ metadata ->className ,
102+ $ propertyMetadata ->propertyName ,
103+ $ normalizer ::class,
104+ $ e ,
105+ );
73106 }
74107
75108 try {
76- $ propertyMetadata ->setValue ($ object , $ value );
109+ $ propertyMetadata ->reflection -> setValue ($ object , $ value );
77110 } catch (TypeError $ e ) {
78111 throw new TypeMismatch (
79112 $ metadata ->className ,
80113 $ propertyMetadata ->propertyName ,
81114 $ e ,
82115 );
83116 }
117+
118+ next_with_normalizer:
84119 }
85120
86121 return $ object ;
@@ -95,7 +130,7 @@ public function extract(ClassMetadata $metadata, object $object, array $context,
95130 {
96131 $ objectId = spl_object_id ($ object );
97132
98- if (array_key_exists ( $ objectId , $ this ->callStack )) {
133+ if (isset ( $ this ->callStack [ $ objectId ] )) {
99134 $ references = array_values ($ this ->callStack );
100135 $ references [] = $ object ::class;
101136
@@ -107,26 +142,30 @@ public function extract(ClassMetadata $metadata, object $object, array $context,
107142 try {
108143 $ data = [];
109144
110- foreach ($ metadata ->properties as $ propertyMetadata ) {
111- if ($ propertyMetadata ->normalizer ) {
112- try {
113- /** @psalm-suppress MixedAssignment */
114- $ data [$ propertyMetadata ->fieldName ] = $ propertyMetadata ->normalizer ->normalize (
115- $ propertyMetadata ->getValue ($ object ),
116- $ context ,
117- );
118- } catch (CircularReference $ e ) {
145+ foreach ($ metadata ->propertiesWithoutNormalizer as $ propertyMetadata ) {
146+ $ data [$ propertyMetadata ->fieldName ] = $ propertyMetadata ->reflection ->getValue ($ object );
147+ }
148+
149+ foreach ($ metadata ->propertiesWithNormalizer as $ propertyMetadata ) {
150+ $ normalizer = $ propertyMetadata ->normalizer ;
151+
152+ try {
153+ /** @psalm-suppress MixedAssignment */
154+ $ data [$ propertyMetadata ->fieldName ] = $ normalizer ->normalize (
155+ $ propertyMetadata ->reflection ->getValue ($ object ),
156+ $ context ,
157+ );
158+ } catch (Throwable $ e ) {
159+ if ($ e instanceof CircularReference) {
119160 throw $ e ;
120- } catch (Throwable $ e ) {
121- throw new NormalizationFailure (
122- $ object ::class,
123- $ propertyMetadata ->propertyName ,
124- $ propertyMetadata ->normalizer ::class,
125- $ e ,
126- );
127161 }
128- } else {
129- $ data [$ propertyMetadata ->fieldName ] = $ propertyMetadata ->getValue ($ object );
162+
163+ throw new NormalizationFailure (
164+ $ object ::class,
165+ $ propertyMetadata ->propertyName ,
166+ $ normalizer ::class,
167+ $ e ,
168+ );
130169 }
131170 }
132171 } finally {
0 commit comments