|
@@ -3,9 +3,13 @@
|
|
|
namespace Mpociot\ApiDoc\Generators;
|
|
|
|
|
|
use ReflectionClass;
|
|
|
+use League\Fractal\Manager;
|
|
|
use Illuminate\Routing\Route;
|
|
|
+use League\Fractal\Resource\Item;
|
|
|
use Illuminate\Support\Facades\App;
|
|
|
+use Mpociot\Reflection\DocBlock\Tag;
|
|
|
use Illuminate\Support\Facades\Request;
|
|
|
+use League\Fractal\Resource\Collection;
|
|
|
use Illuminate\Foundation\Http\FormRequest;
|
|
|
|
|
|
class LaravelGenerator extends AbstractGenerator
|
|
@@ -53,9 +57,27 @@ class LaravelGenerator extends AbstractGenerator
|
|
|
$routeAction = $route->getAction();
|
|
|
$routeGroup = $this->getRouteGroup($routeAction['uses']);
|
|
|
$routeDescription = $this->getRouteDescription($routeAction['uses']);
|
|
|
+ $showresponse = null;
|
|
|
|
|
|
if ($withResponse) {
|
|
|
- $response = $this->getRouteResponse($route, $bindings, $headers);
|
|
|
+ $response = null;
|
|
|
+ $docblockResponse = $this->getDocblockResponse($routeDescription['tags']);
|
|
|
+ if ($docblockResponse) {
|
|
|
+ // we have a response from the docblock ( @response )
|
|
|
+ $response = $docblockResponse;
|
|
|
+ $showresponse = true;
|
|
|
+ }
|
|
|
+ if (! $response) {
|
|
|
+ $transformerResponse = $this->getTransformerResponse($routeDescription['tags']);
|
|
|
+ if ($transformerResponse) {
|
|
|
+ // we have a transformer response from the docblock ( @transformer || @transformercollection )
|
|
|
+ $response = $transformerResponse;
|
|
|
+ $showresponse = true;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (! $response) {
|
|
|
+ $response = $this->getRouteResponse($route, $bindings, $headers);
|
|
|
+ }
|
|
|
if ($response->headers->get('Content-Type') === 'application/json') {
|
|
|
$content = json_encode(json_decode($response->getContent()), JSON_PRETTY_PRINT);
|
|
|
} else {
|
|
@@ -72,6 +94,7 @@ class LaravelGenerator extends AbstractGenerator
|
|
|
'uri' => $this->getUri($route),
|
|
|
'parameters' => [],
|
|
|
'response' => $content,
|
|
|
+ 'showresponse' => $showresponse,
|
|
|
], $routeAction, $bindings);
|
|
|
}
|
|
|
|
|
@@ -125,6 +148,99 @@ class LaravelGenerator extends AbstractGenerator
|
|
|
return $response;
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * Get a response from the transformer tags.
|
|
|
+ *
|
|
|
+ * @param array $tags
|
|
|
+ *
|
|
|
+ * @return mixed
|
|
|
+ */
|
|
|
+ protected function getTransformerResponse($tags)
|
|
|
+ {
|
|
|
+ try {
|
|
|
+ $transFormerTags = array_filter($tags, function ($tag) {
|
|
|
+ if (! ($tag instanceof Tag)) {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ return \in_array(\strtolower($tag->getName()), ['transformer', 'transformercollection']);
|
|
|
+ });
|
|
|
+ if (empty($transFormerTags)) {
|
|
|
+ // we didn't have any of the tags so goodbye
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ $modelTag = array_first(array_filter($tags, function ($tag) {
|
|
|
+ if (! ($tag instanceof Tag)) {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ return \in_array(\strtolower($tag->getName()), ['transformermodel']);
|
|
|
+ }));
|
|
|
+ $tag = \array_first($transFormerTags);
|
|
|
+ $transformer = $tag->getContent();
|
|
|
+ if (! \class_exists($transformer)) {
|
|
|
+ // if we can't find the transformer we can't generate a response
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ $demoData = [];
|
|
|
+
|
|
|
+ $reflection = new ReflectionClass($transformer);
|
|
|
+ $method = $reflection->getMethod('transform');
|
|
|
+ $parameter = \array_first($method->getParameters());
|
|
|
+ $type = null;
|
|
|
+ if ($modelTag) {
|
|
|
+ $type = $modelTag->getContent();
|
|
|
+ }
|
|
|
+ if (version_compare(PHP_VERSION, '7.0.0') >= 0 && \is_null($type)) {
|
|
|
+ // we can only get the type with reflection for PHP 7
|
|
|
+ if ($parameter->hasType() &&
|
|
|
+ ! $parameter->getType()->isBuiltin() &&
|
|
|
+ \class_exists((string) $parameter->getType())) {
|
|
|
+ //we have a type
|
|
|
+ $type = (string) $parameter->getType();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if ($type) {
|
|
|
+ // we have a class so we try to create an instance
|
|
|
+ $demoData = new $type;
|
|
|
+ try {
|
|
|
+ // try a factory
|
|
|
+ $demoData = \factory($type)->make();
|
|
|
+ } catch (\Exception $e) {
|
|
|
+ if ($demoData instanceof \Illuminate\Database\Eloquent\Model) {
|
|
|
+ // we can't use a factory but can try to get one from the database
|
|
|
+ try {
|
|
|
+ // check if we can find one
|
|
|
+ $newDemoData = $type::first();
|
|
|
+ if ($newDemoData) {
|
|
|
+ $demoData = $newDemoData;
|
|
|
+ }
|
|
|
+ } catch (\Exception $e) {
|
|
|
+ // do nothing
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ $fractal = new Manager();
|
|
|
+ $resource = [];
|
|
|
+ if ($tag->getName() == 'transformer') {
|
|
|
+ // just one
|
|
|
+ $resource = new Item($demoData, new $transformer);
|
|
|
+ }
|
|
|
+ if ($tag->getName() == 'transformercollection') {
|
|
|
+ // a collection
|
|
|
+ $resource = new Collection([$demoData, $demoData], new $transformer);
|
|
|
+ }
|
|
|
+
|
|
|
+ return \response($fractal->createData($resource)->toJson());
|
|
|
+ } catch (\Exception $e) {
|
|
|
+ // it isn't possible to parse the transformer
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
/**
|
|
|
* @param string $route
|
|
|
* @param array $bindings
|