@@ -51,6 +51,8 @@ abstract class AbstractItemNormalizer extends AbstractObjectNormalizer
51
51
use ContextTrait;
52
52
use InputOutputMetadataTrait;
53
53
54
+ public const IS_TRANSFORMED_TO_SAME_CLASS = 'is_transformed_to_same_class ' ;
55
+
54
56
protected $ propertyNameCollectionFactory ;
55
57
protected $ propertyMetadataFactory ;
56
58
protected $ iriConverter ;
@@ -112,18 +114,24 @@ public function hasCacheableSupportsMethod(): bool
112
114
*/
113
115
public function normalize ($ object , $ format = null , array $ context = [])
114
116
{
115
- if ($ object !== $ transformed = $ this ->transformOutput ( $ object , $ context )) {
117
+ if (!( $ isTransformed = isset ( $ context [ self :: IS_TRANSFORMED_TO_SAME_CLASS ])) && $ outputClass = $ this ->getOutputClass ( $ this -> getObjectClass ( $ object) , $ context )) {
116
118
if (!$ this ->serializer instanceof NormalizerInterface) {
117
119
throw new LogicException ('Cannot normalize the output because the injected serializer is not a normalizer ' );
118
120
}
119
121
120
- $ context ['api_normalize ' ] = true ;
121
- $ context ['api_resource ' ] = $ object ;
122
- unset($ context ['output ' ]);
123
- unset($ context ['resource_class ' ]);
122
+ if ($ object !== $ transformed = $ this ->transformOutput ($ object , $ context , $ outputClass )) {
123
+ $ context ['api_normalize ' ] = true ;
124
+ $ context ['api_resource ' ] = $ object ;
125
+ unset($ context ['output ' ], $ context ['resource_class ' ]);
126
+ } else {
127
+ $ context [self ::IS_TRANSFORMED_TO_SAME_CLASS ] = true ;
128
+ }
124
129
125
130
return $ this ->serializer ->normalize ($ transformed , $ format , $ context );
126
131
}
132
+ if ($ isTransformed ) {
133
+ unset($ context [self ::IS_TRANSFORMED_TO_SAME_CLASS ]);
134
+ }
127
135
128
136
$ resourceClass = $ this ->resourceClassResolver ->getResourceClass ($ object , $ context ['resource_class ' ] ?? null );
129
137
$ context = $ this ->initContext ($ resourceClass , $ context );
@@ -637,9 +645,12 @@ protected function getDataTransformer($data, string $to, array $context = []): ?
637
645
* For a given resource, it returns an output representation if any
638
646
* If not, the resource is returned.
639
647
*/
640
- protected function transformOutput ($ object , array $ context = [])
648
+ protected function transformOutput ($ object , array $ context = [], string $ outputClass = null )
641
649
{
642
- $ outputClass = $ this ->getOutputClass ($ this ->getObjectClass ($ object ), $ context );
650
+ if (null === $ outputClass ) {
651
+ $ outputClass = $ this ->getOutputClass ($ this ->getObjectClass ($ object ), $ context );
652
+ }
653
+
643
654
if (null !== $ outputClass && null !== $ dataTransformer = $ this ->getDataTransformer ($ object , $ outputClass , $ context )) {
644
655
return $ dataTransformer ->transform ($ object , $ outputClass , $ context );
645
656
}
0 commit comments