Skip to content

Commit 18938eb

Browse files
committed
Set status code for transformer response from tag if present
1 parent 96120bb commit 18938eb

File tree

4 files changed

+40
-8
lines changed

4 files changed

+40
-8
lines changed

src/Strategies/Responses/ResponseCalls.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,8 @@ public function __invoke(Route $route, \ReflectionClass $controller, \Reflection
4343
$request = $this->prepareRequest($route, $rulesToApply, $bodyParameters, $queryParameters);
4444

4545
try {
46-
$response = [200 => $this->makeApiCall($request)->getContent()];
46+
$response = $this->makeApiCall($request);
47+
$response = [$response->getStatusCode() => $response->getContent()];
4748
} catch (\Exception $e) {
4849
echo 'Exception thrown during response call for ['.implode(',', $route->methods)."] {$route->uri}.\n";
4950
if (Flags::$shouldBeVerbose) {

src/Strategies/Responses/UseTransformerTags.php

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ protected function getTransformerResponse(array $tags)
5454
return null;
5555
}
5656

57-
$transformer = $this->getTransformerClass($transformerTag);
57+
list($statusCode, $transformer) = $this->getStatusCodeAmdTransformerClass($transformerTag);
5858
$model = $this->getClassToBeTransformed($tags, (new ReflectionClass($transformer))->getMethod('transform'));
5959
$modelInstance = $this->instantiateTransformerModel($model);
6060

@@ -68,7 +68,7 @@ protected function getTransformerResponse(array $tags)
6868
? new Collection([$modelInstance, $modelInstance], new $transformer)
6969
: new Item($modelInstance, new $transformer);
7070

71-
return [200 => response($fractal->createData($resource)->toJson())->getContent()];
71+
return [$statusCode => response($fractal->createData($resource)->toJson())->getContent()];
7272
} catch (\Exception $e) {
7373
return null;
7474
}
@@ -77,11 +77,16 @@ protected function getTransformerResponse(array $tags)
7777
/**
7878
* @param Tag $tag
7979
*
80-
* @return string|null
80+
* @return array
8181
*/
82-
private function getTransformerClass($tag)
82+
private function getStatusCodeAmdTransformerClass($tag): array
8383
{
84-
return $tag->getContent();
84+
$content = $tag->getContent();
85+
preg_match('/^(\d{3})?\s?([\s\S]*)$/', $content, $result);
86+
$status = $result[1] ?: 200;
87+
$transformerClass = $result[2];
88+
89+
return [$status, $transformerClass];
8590
}
8691

8792
/**

tests/Fixtures/TestController.php

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -251,6 +251,14 @@ public function transformerTag()
251251
return '';
252252
}
253253

254+
/**
255+
* @transformer 201 \Mpociot\ApiDoc\Tests\Fixtures\TestTransformer
256+
*/
257+
public function transformerTagWithStatusCode()
258+
{
259+
return '';
260+
}
261+
254262
/**
255263
* @transformer \Mpociot\ApiDoc\Tests\Fixtures\TestTransformer
256264
* @transformermodel \Mpociot\ApiDoc\Tests\Fixtures\TestModel

tests/Unit/GeneratorTestCase.php

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -435,8 +435,26 @@ public function can_parse_transformer_tag_with_model()
435435
$this->assertTrue(is_array($response));
436436
$this->assertEquals(200, $response['status']);
437437
$this->assertSame(
438-
$response['content'],
439-
'{"data":{"id":1,"description":"Welcome on this test versions","name":"TestName"}}'
438+
'{"data":{"id":1,"description":"Welcome on this test versions","name":"TestName"}}',
439+
$response['content']
440+
);
441+
}
442+
443+
/** @test */
444+
public function can_parse_transformer_tag_with_status_code()
445+
{
446+
$route = $this->createRoute('GET', '/transformerTagWithStatusCode', 'transformerTagWithStatusCode');
447+
$parsed = $this->generator->processRoute($route);
448+
$response = Arr::first($parsed['response']);
449+
450+
$this->assertTrue(is_array($parsed));
451+
$this->assertArrayHasKey('showresponse', $parsed);
452+
$this->assertTrue($parsed['showresponse']);
453+
$this->assertTrue(is_array($response));
454+
$this->assertEquals(201, $response['status']);
455+
$this->assertSame(
456+
'{"data":{"id":1,"description":"Welcome on this test versions","name":"TestName"}}',
457+
$response['content']
440458
);
441459
}
442460

0 commit comments

Comments
 (0)