Skip to content

Commit cc0ae12

Browse files
feat: support dynamic HTTP response status code via request attribute (#7904)
1 parent 70769a5 commit cc0ae12

2 files changed

Lines changed: 32 additions & 0 deletions

File tree

src/State/Util/HttpResponseStatusTrait.php

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,10 @@ trait HttpResponseStatusTrait
3737
*/
3838
private function getStatus(Request $request, HttpOperation $operation, array $context): int
3939
{
40+
if ($request->attributes->has('_api_response_status')) {
41+
return $request->attributes->getInt('_api_response_status');
42+
}
43+
4044
$status = $operation->getStatus();
4145
$method = $request->getMethod();
4246

tests/State/RespondProcessorTest.php

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -162,6 +162,34 @@ public function testAddsLinkedDataPlatformHeaders(): void
162162
$this->assertSame('application/ld+json', $response->headers->get('Accept-Post'));
163163
}
164164

165+
public function testDynamicResponseStatusFromRequestAttribute(): void
166+
{
167+
$operation = new Post(class: Employee::class);
168+
169+
$resourceClassResolver = $this->prophesize(ResourceClassResolverInterface::class);
170+
$resourceClassResolver->isResourceClass(Employee::class)->willReturn(true);
171+
172+
$respondProcessor = new RespondProcessor(null, $resourceClassResolver->reveal());
173+
174+
$req = new Request([], [], ['_api_response_status' => 200]);
175+
$req->setMethod('POST');
176+
$response = $respondProcessor->process('content', $operation, context: [
177+
'request' => $req,
178+
'original_data' => new Employee(),
179+
]);
180+
181+
$this->assertSame(200, $response->getStatusCode());
182+
183+
$req = new Request();
184+
$req->setMethod('POST');
185+
$response = $respondProcessor->process('content', $operation, context: [
186+
'request' => $req,
187+
'original_data' => new Employee(),
188+
]);
189+
190+
$this->assertSame(201, $response->getStatusCode());
191+
}
192+
165193
public function testDoesNotAddLinkedDataPlatformHeadersWithoutFactory(): void
166194
{
167195
$operation = new Get(uriTemplate: '/employees/{id}', class: Employee::class);

0 commit comments

Comments
 (0)