Skip to content

Commit a6de40a

Browse files
authored
Merge pull request #318 from shalvah/parse-response-tags-for-all-methods
Parse response tags for all HTTP verbs
2 parents af9da31 + 2117dcf commit a6de40a

File tree

6 files changed

+61
-102
lines changed

6 files changed

+61
-102
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
1010
### Changed
1111

1212
### Fixed
13+
- Parse `@response` tags regardless of HTTP method
1314

1415
### Removed
1516

src/Mpociot/ApiDoc/Generators/AbstractGenerator.php

Lines changed: 56 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,61 @@ abstract public function getMethods($route);
4343
*
4444
* @return array
4545
*/
46-
abstract public function processRoute($route, $bindings = [], $withResponse = true);
46+
public function processRoute($route, $bindings = [], $headers = [], $withResponse = true)
47+
{
48+
$routeDomain = $route->domain();
49+
$routeAction = $route->getAction();
50+
$routeGroup = $this->getRouteGroup($routeAction['uses']);
51+
$routeDescription = $this->getRouteDescription($routeAction['uses']);
52+
$showresponse = null;
53+
54+
// set correct route domain
55+
$headers[] = "HTTP_HOST: {$routeDomain}";
56+
$headers[] = "SERVER_NAME: {$routeDomain}";
57+
58+
$content = '';
59+
$response = null;
60+
$docblockResponse = $this->getDocblockResponse($routeDescription['tags']);
61+
if ($docblockResponse) {
62+
// we have a response from the docblock ( @response )
63+
$response = $docblockResponse;
64+
$showresponse = true;
65+
$content = $response->getContent();
66+
}
67+
if (! $response) {
68+
$transformerResponse = $this->getTransformerResponse($routeDescription['tags']);
69+
if ($transformerResponse) {
70+
// we have a transformer response from the docblock ( @transformer || @transformercollection )
71+
$response = $transformerResponse;
72+
$showresponse = true;
73+
$content = $response->getContent();
74+
}
75+
}
76+
if (! $response && $withResponse) {
77+
try {
78+
$response = $this->getRouteResponse($route, $bindings, $headers);
79+
if ($response->headers->get('Content-Type') === 'application/json') {
80+
$content = json_decode($response->getContent(), JSON_PRETTY_PRINT);
81+
} else {
82+
$content = $response->getContent();
83+
}
84+
} catch (\Exception $e) {
85+
dump("Couldn't get response for route: ".implode(',', $this->getMethods($route)).'] '.$route->uri()."", $e);
86+
}
87+
}
88+
89+
return $this->getParameters([
90+
'id' => md5($this->getUri($route).':'.implode($this->getMethods($route))),
91+
'resource' => $routeGroup,
92+
'title' => $routeDescription['short'],
93+
'description' => $routeDescription['long'],
94+
'methods' => $this->getMethods($route),
95+
'uri' => $this->getUri($route),
96+
'parameters' => [],
97+
'response' => $content,
98+
'showresponse' => $showresponse,
99+
], $routeAction, $bindings);
100+
}
47101

48102
/**
49103
* Prepares / Disables route middlewares.
@@ -179,7 +233,7 @@ protected function addRouteModelBindings($route, $bindings)
179233
/**
180234
* @param \Illuminate\Routing\Route $route
181235
*
182-
* @return string
236+
* @return array
183237
*/
184238
protected function getRouteDescription($route)
185239
{

src/Mpociot/ApiDoc/Generators/DingoGenerator.php

Lines changed: 0 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -2,45 +2,9 @@
22

33
namespace Mpociot\ApiDoc\Generators;
44

5-
use Exception;
65

76
class DingoGenerator extends AbstractGenerator
87
{
9-
/**
10-
* @param \Illuminate\Routing\Route $route
11-
* @param array $bindings
12-
* @param array $headers
13-
* @param bool $withResponse
14-
*
15-
* @return array
16-
*/
17-
public function processRoute($route, $bindings = [], $headers = [], $withResponse = true)
18-
{
19-
$response = '';
20-
21-
if ($withResponse) {
22-
try {
23-
$response = $this->getRouteResponse($route, $bindings, $headers);
24-
} catch (Exception $e) {
25-
}
26-
}
27-
28-
$routeAction = $route->getAction();
29-
$routeGroup = $this->getRouteGroup($routeAction['uses']);
30-
$routeDescription = $this->getRouteDescription($routeAction['uses']);
31-
32-
return $this->getParameters([
33-
'id' => md5($route->uri().':'.implode($route->getMethods())),
34-
'resource' => $routeGroup,
35-
'title' => $routeDescription['short'],
36-
'description' => $routeDescription['long'],
37-
'methods' => $route->getMethods(),
38-
'uri' => $route->uri(),
39-
'parameters' => [],
40-
'response' => $response,
41-
], $routeAction, $bindings);
42-
}
43-
448
/**
459
* Prepares / Disables route middlewares.
4610
*

src/Mpociot/ApiDoc/Generators/LaravelGenerator.php

Lines changed: 1 addition & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
namespace Mpociot\ApiDoc\Generators;
44

5+
use Exception;
56
use ReflectionClass;
67
use League\Fractal\Manager;
78
use Illuminate\Routing\Route;
@@ -53,67 +54,6 @@ public function getMethods($route)
5354
return array_diff($methods, ['HEAD']);
5455
}
5556

56-
/**
57-
* @param \Illuminate\Routing\Route $route
58-
* @param array $bindings
59-
* @param array $headers
60-
* @param bool $withResponse
61-
*
62-
* @return array
63-
*/
64-
public function processRoute($route, $bindings = [], $headers = [], $withResponse = true)
65-
{
66-
$content = '';
67-
68-
$routeDomain = $route->domain();
69-
$routeAction = $route->getAction();
70-
$routeGroup = $this->getRouteGroup($routeAction['uses']);
71-
$routeDescription = $this->getRouteDescription($routeAction['uses']);
72-
$showresponse = null;
73-
74-
// set correct route domain
75-
$headers[] = "HTTP_HOST: {$routeDomain}";
76-
$headers[] = "SERVER_NAME: {$routeDomain}";
77-
78-
if ($withResponse) {
79-
$response = null;
80-
$docblockResponse = $this->getDocblockResponse($routeDescription['tags']);
81-
if ($docblockResponse) {
82-
// we have a response from the docblock ( @response )
83-
$response = $docblockResponse;
84-
$showresponse = true;
85-
}
86-
if (! $response) {
87-
$transformerResponse = $this->getTransformerResponse($routeDescription['tags']);
88-
if ($transformerResponse) {
89-
// we have a transformer response from the docblock ( @transformer || @transformercollection )
90-
$response = $transformerResponse;
91-
$showresponse = true;
92-
}
93-
}
94-
if (! $response) {
95-
$response = $this->getRouteResponse($route, $bindings, $headers);
96-
}
97-
if ($response->headers->get('Content-Type') === 'application/json') {
98-
$content = json_decode($response->getContent(), JSON_PRETTY_PRINT);
99-
} else {
100-
$content = $response->getContent();
101-
}
102-
}
103-
104-
return $this->getParameters([
105-
'id' => md5($this->getUri($route).':'.implode($this->getMethods($route))),
106-
'resource' => $routeGroup,
107-
'title' => $routeDescription['short'],
108-
'description' => $routeDescription['long'],
109-
'methods' => $this->getMethods($route),
110-
'uri' => $this->getUri($route),
111-
'parameters' => [],
112-
'response' => $content,
113-
'showresponse' => $showresponse,
114-
], $routeAction, $bindings);
115-
}
116-
11757
/**
11858
* Prepares / Disables route middlewares.
11959
*

tests/ApiDocGeneratorTest.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -350,12 +350,12 @@ public function testCustomFormRequestValidatorIsSupported()
350350
public function testCanParseResponseTag()
351351
{
352352
RouteFacade::post('/responseTag', TestController::class.'@responseTag');
353-
$route = new Route(['GET'], '/responseTag', ['uses' => TestController::class.'@responseTag']);
353+
$route = new Route(['POST'], '/responseTag', ['uses' => TestController::class.'@responseTag']);
354354
$parsed = $this->generator->processRoute($route);
355355
$this->assertTrue(is_array($parsed));
356356
$this->assertArrayHasKey('showresponse', $parsed);
357357
$this->assertTrue($parsed['showresponse']);
358-
$this->assertSame($parsed['response'], "{\n data: [],\n}");
358+
$this->assertJsonStringEqualsJsonString(json_decode($parsed['response'], true), "{ \"data\": []}");
359359
}
360360

361361
public function testCanParseTransformerTag()

tests/Fixtures/TestController.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ public function skip()
7979

8080
/**
8181
* @response {
82-
* data: [],
82+
* "data": []
8383
*}
8484
*/
8585
public function responseTag()

0 commit comments

Comments
 (0)