From 92cc872cd9e9ce7c80912ac8a63d649004c2e0d6 Mon Sep 17 00:00:00 2001 From: Yury Garris Date: Fri, 17 May 2019 18:14:13 +0200 Subject: [PATCH 1/3] fixes #2803 --- src/EventListener/WriteListener.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/EventListener/WriteListener.php b/src/EventListener/WriteListener.php index 26ae4829baa..bb29c7055fa 100644 --- a/src/EventListener/WriteListener.php +++ b/src/EventListener/WriteListener.php @@ -91,7 +91,7 @@ public function onKernelView(GetResponseForControllerResultEvent $event): void } if ($hasOutput) { - $request->attributes->set('_api_write_item_iri', $this->iriConverter->getIriFromItem($controllerResult)); + $request->attributes->set('_api_write_item_iri', $this->iriConverter->getIriFromResourceClass($attributes['resource_class'])); } break; case 'DELETE': From fd6c84684fd116f2d2c128db08627076c73bf67e Mon Sep 17 00:00:00 2001 From: Yury Garris Date: Mon, 20 May 2019 13:27:31 +0200 Subject: [PATCH 2/3] fixup --- src/EventListener/WriteListener.php | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/EventListener/WriteListener.php b/src/EventListener/WriteListener.php index bb29c7055fa..b387eae0927 100644 --- a/src/EventListener/WriteListener.php +++ b/src/EventListener/WriteListener.php @@ -84,13 +84,22 @@ public function onKernelView(GetResponseForControllerResultEvent $event): void } $hasOutput = true; + $getIriFromItem = false; + $getIriFromResourceClass = false; if (null !== $this->resourceMetadataFactory) { $resourceMetadata = $this->resourceMetadataFactory->create($attributes['resource_class']); $outputMetadata = $resourceMetadata->getOperationAttribute($attributes, 'output', ['class' => $attributes['resource_class']], true); $hasOutput = \array_key_exists('class', $outputMetadata) && null !== $outputMetadata['class'] && $controllerResult instanceof $outputMetadata['class']; + if ($outputMetadata['class'] === $attributes['resource_class']) { + $getIriFromItem = true; + } else { + $getIriFromResourceClass = true; + } } - if ($hasOutput) { + if ($hasOutput && $getIriFromItem) { + $request->attributes->set('_api_write_item_iri', $this->iriConverter->getIriFromItem($controllerResult)); + } elseif ($hasOutput && $getIriFromResourceClass) { $request->attributes->set('_api_write_item_iri', $this->iriConverter->getIriFromResourceClass($attributes['resource_class'])); } break; From 5ee5ede7e9f81c1ae81b78e6b0e7ad6de29ddae5 Mon Sep 17 00:00:00 2001 From: Yury Garris Date: Mon, 20 May 2019 13:50:30 +0200 Subject: [PATCH 3/3] set `_api_write_item_iri` only if result object is a subclass of resource class --- src/EventListener/WriteListener.php | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/src/EventListener/WriteListener.php b/src/EventListener/WriteListener.php index b387eae0927..6cbdfc3f717 100644 --- a/src/EventListener/WriteListener.php +++ b/src/EventListener/WriteListener.php @@ -84,23 +84,14 @@ public function onKernelView(GetResponseForControllerResultEvent $event): void } $hasOutput = true; - $getIriFromItem = false; - $getIriFromResourceClass = false; if (null !== $this->resourceMetadataFactory) { $resourceMetadata = $this->resourceMetadataFactory->create($attributes['resource_class']); $outputMetadata = $resourceMetadata->getOperationAttribute($attributes, 'output', ['class' => $attributes['resource_class']], true); $hasOutput = \array_key_exists('class', $outputMetadata) && null !== $outputMetadata['class'] && $controllerResult instanceof $outputMetadata['class']; - if ($outputMetadata['class'] === $attributes['resource_class']) { - $getIriFromItem = true; - } else { - $getIriFromResourceClass = true; - } } - if ($hasOutput && $getIriFromItem) { + if ($hasOutput && is_subclass_of($controllerResult, $attributes['resource_class'], true)) { $request->attributes->set('_api_write_item_iri', $this->iriConverter->getIriFromItem($controllerResult)); - } elseif ($hasOutput && $getIriFromResourceClass) { - $request->attributes->set('_api_write_item_iri', $this->iriConverter->getIriFromResourceClass($attributes['resource_class'])); } break; case 'DELETE':