diff --git a/src/State/Util/HttpResponseStatusTrait.php b/src/State/Util/HttpResponseStatusTrait.php index 89b9156c3ea..86745540386 100644 --- a/src/State/Util/HttpResponseStatusTrait.php +++ b/src/State/Util/HttpResponseStatusTrait.php @@ -37,6 +37,10 @@ trait HttpResponseStatusTrait */ private function getStatus(Request $request, HttpOperation $operation, array $context): int { + if ($request->attributes->has('_api_response_status')) { + return $request->attributes->getInt('_api_response_status'); + } + $status = $operation->getStatus(); $method = $request->getMethod(); diff --git a/tests/State/RespondProcessorTest.php b/tests/State/RespondProcessorTest.php index 34db1b78173..1db422acf49 100644 --- a/tests/State/RespondProcessorTest.php +++ b/tests/State/RespondProcessorTest.php @@ -162,6 +162,34 @@ public function testAddsLinkedDataPlatformHeaders(): void $this->assertSame('application/ld+json', $response->headers->get('Accept-Post')); } + public function testDynamicResponseStatusFromRequestAttribute(): void + { + $operation = new Post(class: Employee::class); + + $resourceClassResolver = $this->prophesize(ResourceClassResolverInterface::class); + $resourceClassResolver->isResourceClass(Employee::class)->willReturn(true); + + $respondProcessor = new RespondProcessor(null, $resourceClassResolver->reveal()); + + $req = new Request([], [], ['_api_response_status' => 200]); + $req->setMethod('POST'); + $response = $respondProcessor->process('content', $operation, context: [ + 'request' => $req, + 'original_data' => new Employee(), + ]); + + $this->assertSame(200, $response->getStatusCode()); + + $req = new Request(); + $req->setMethod('POST'); + $response = $respondProcessor->process('content', $operation, context: [ + 'request' => $req, + 'original_data' => new Employee(), + ]); + + $this->assertSame(201, $response->getStatusCode()); + } + public function testDoesNotAddLinkedDataPlatformHeadersWithoutFactory(): void { $operation = new Get(uriTemplate: '/employees/{id}', class: Employee::class);