Skip to content

Commit 0907ddf

Browse files
authored
Merge pull request #323 from shalvah/parse-json-responses
Add support for transformer response using DIngo router
2 parents 0f1de59 + a581e33 commit 0907ddf

File tree

2 files changed

+97
-99
lines changed

2 files changed

+97
-99
lines changed

src/Mpociot/ApiDoc/Generators/AbstractGenerator.php

Lines changed: 97 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,9 @@
33
namespace Mpociot\ApiDoc\Generators;
44

55
use Faker\Factory;
6+
use League\Fractal\Manager;
7+
use League\Fractal\Resource\Collection;
8+
use League\Fractal\Resource\Item;
69
use ReflectionClass;
710
use Illuminate\Support\Arr;
811
use Illuminate\Support\Str;
@@ -74,7 +77,7 @@ public function processRoute($route, $bindings = [], $headers = [], $withRespons
7477
try {
7578
$response = $this->getRouteResponse($route, $bindings, $headers);
7679
} catch (\Exception $e) {
77-
dump("Couldn't get response for route: ".implode(',', $this->getMethods($route)).'] '.$route->uri().'', $e);
80+
dump("Couldn't get response for route: ".implode(',', $this->getMethods($route)).'] '.$route->uri().'', $e->getMessage());
7881
}
7982
}
8083

@@ -678,4 +681,97 @@ private function getResponseContent($response)
678681

679682
return $content;
680683
}
684+
685+
/**
686+
* Get a response from the transformer tags.
687+
*
688+
* @param array $tags
689+
*
690+
* @return mixed
691+
*/
692+
protected function getTransformerResponse($tags)
693+
{
694+
try {
695+
$transFormerTags = array_filter($tags, function ($tag) {
696+
if (! ($tag instanceof Tag)) {
697+
return false;
698+
}
699+
700+
return \in_array(\strtolower($tag->getName()), ['transformer', 'transformercollection']);
701+
});
702+
if (empty($transFormerTags)) {
703+
// we didn't have any of the tags so goodbye
704+
return false;
705+
}
706+
707+
$modelTag = array_first(array_filter($tags, function ($tag) {
708+
if (! ($tag instanceof Tag)) {
709+
return false;
710+
}
711+
712+
return \in_array(\strtolower($tag->getName()), ['transformermodel']);
713+
}));
714+
$tag = \array_first($transFormerTags);
715+
$transformer = $tag->getContent();
716+
if (! \class_exists($transformer)) {
717+
// if we can't find the transformer we can't generate a response
718+
return;
719+
}
720+
$demoData = [];
721+
722+
$reflection = new ReflectionClass($transformer);
723+
$method = $reflection->getMethod('transform');
724+
$parameter = \array_first($method->getParameters());
725+
$type = null;
726+
if ($modelTag) {
727+
$type = $modelTag->getContent();
728+
}
729+
if (version_compare(PHP_VERSION, '7.0.0') >= 0 && \is_null($type)) {
730+
// we can only get the type with reflection for PHP 7
731+
if ($parameter->hasType() &&
732+
! $parameter->getType()->isBuiltin() &&
733+
\class_exists((string) $parameter->getType())) {
734+
//we have a type
735+
$type = (string) $parameter->getType();
736+
}
737+
}
738+
if ($type) {
739+
// we have a class so we try to create an instance
740+
$demoData = new $type;
741+
try {
742+
// try a factory
743+
$demoData = \factory($type)->make();
744+
} catch (\Exception $e) {
745+
if ($demoData instanceof \Illuminate\Database\Eloquent\Model) {
746+
// we can't use a factory but can try to get one from the database
747+
try {
748+
// check if we can find one
749+
$newDemoData = $type::first();
750+
if ($newDemoData) {
751+
$demoData = $newDemoData;
752+
}
753+
} catch (\Exception $e) {
754+
// do nothing
755+
}
756+
}
757+
}
758+
}
759+
760+
$fractal = new Manager();
761+
$resource = [];
762+
if ($tag->getName() == 'transformer') {
763+
// just one
764+
$resource = new Item($demoData, new $transformer);
765+
}
766+
if ($tag->getName() == 'transformercollection') {
767+
// a collection
768+
$resource = new Collection([$demoData, $demoData], new $transformer);
769+
}
770+
771+
return \response($fractal->createData($resource)->toJson());
772+
} catch (\Exception $e) {
773+
// it isn't possible to parse the transformer
774+
return;
775+
}
776+
}
681777
}

src/Mpociot/ApiDoc/Generators/LaravelGenerator.php

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

33
namespace Mpociot\ApiDoc\Generators;
44

5-
use ReflectionClass;
6-
use League\Fractal\Manager;
75
use Illuminate\Routing\Route;
8-
use League\Fractal\Resource\Item;
96
use Illuminate\Support\Facades\App;
10-
use Mpociot\Reflection\DocBlock\Tag;
117
use Illuminate\Support\Facades\Request;
12-
use League\Fractal\Resource\Collection;
138

149
class LaravelGenerator extends AbstractGenerator
1510
{
@@ -97,97 +92,4 @@ public function callRoute($method, $uri, $parameters = [], $cookies = [], $files
9792

9893
return $response;
9994
}
100-
101-
/**
102-
* Get a response from the transformer tags.
103-
*
104-
* @param array $tags
105-
*
106-
* @return mixed
107-
*/
108-
protected function getTransformerResponse($tags)
109-
{
110-
try {
111-
$transFormerTags = array_filter($tags, function ($tag) {
112-
if (! ($tag instanceof Tag)) {
113-
return false;
114-
}
115-
116-
return \in_array(\strtolower($tag->getName()), ['transformer', 'transformercollection']);
117-
});
118-
if (empty($transFormerTags)) {
119-
// we didn't have any of the tags so goodbye
120-
return false;
121-
}
122-
123-
$modelTag = array_first(array_filter($tags, function ($tag) {
124-
if (! ($tag instanceof Tag)) {
125-
return false;
126-
}
127-
128-
return \in_array(\strtolower($tag->getName()), ['transformermodel']);
129-
}));
130-
$tag = \array_first($transFormerTags);
131-
$transformer = $tag->getContent();
132-
if (! \class_exists($transformer)) {
133-
// if we can't find the transformer we can't generate a response
134-
return;
135-
}
136-
$demoData = [];
137-
138-
$reflection = new ReflectionClass($transformer);
139-
$method = $reflection->getMethod('transform');
140-
$parameter = \array_first($method->getParameters());
141-
$type = null;
142-
if ($modelTag) {
143-
$type = $modelTag->getContent();
144-
}
145-
if (version_compare(PHP_VERSION, '7.0.0') >= 0 && \is_null($type)) {
146-
// we can only get the type with reflection for PHP 7
147-
if ($parameter->hasType() &&
148-
! $parameter->getType()->isBuiltin() &&
149-
\class_exists((string) $parameter->getType())) {
150-
//we have a type
151-
$type = (string) $parameter->getType();
152-
}
153-
}
154-
if ($type) {
155-
// we have a class so we try to create an instance
156-
$demoData = new $type;
157-
try {
158-
// try a factory
159-
$demoData = \factory($type)->make();
160-
} catch (\Exception $e) {
161-
if ($demoData instanceof \Illuminate\Database\Eloquent\Model) {
162-
// we can't use a factory but can try to get one from the database
163-
try {
164-
// check if we can find one
165-
$newDemoData = $type::first();
166-
if ($newDemoData) {
167-
$demoData = $newDemoData;
168-
}
169-
} catch (\Exception $e) {
170-
// do nothing
171-
}
172-
}
173-
}
174-
}
175-
176-
$fractal = new Manager();
177-
$resource = [];
178-
if ($tag->getName() == 'transformer') {
179-
// just one
180-
$resource = new Item($demoData, new $transformer);
181-
}
182-
if ($tag->getName() == 'transformercollection') {
183-
// a collection
184-
$resource = new Collection([$demoData, $demoData], new $transformer);
185-
}
186-
187-
return \response($fractal->createData($resource)->toJson());
188-
} catch (\Exception $e) {
189-
// it isn't possible to parse the transformer
190-
return;
191-
}
192-
}
19395
}

0 commit comments

Comments
 (0)