Bladeren bron

Add support for multiple response/responsefile tags

Michał Golon 6 jaren geleden
bovenliggende
commit
b20ddd487e

+ 14 - 0
resources/views/partials/route.blade.php

@@ -69,6 +69,19 @@ fetch(url, {
 ```
 
 @if(in_array('GET',$route['methods']) || (isset($route['showresponse']) && $route['showresponse']))
+@if(is_array($route['response']))
+@foreach($route['response'] as $response)
+> Example response ({{$response['status']}}):
+
+```json
+@if(is_object($response['content']) || is_array($response['content']))
+{!! json_encode($response['content'], JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE) !!}
+@else
+{!! json_encode(json_decode($response['content']), JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE) !!}
+@endif
+```
+@endforeach
+@else
 > Example response:
 
 ```json
@@ -79,6 +92,7 @@ fetch(url, {
 @endif
 ```
 @endif
+@endif
 
 ### HTTP Request
 @foreach($route['methods'] as $method)

+ 30 - 1
src/Tools/ResponseResolver.php

@@ -2,6 +2,7 @@
 
 namespace Mpociot\ApiDoc\Tools;
 
+use Illuminate\Http\JsonResponse;
 use Illuminate\Routing\Route;
 use Mpociot\ApiDoc\Tools\ResponseStrategies\ResponseTagStrategy;
 use Mpociot\ApiDoc\Tools\ResponseStrategies\ResponseCallStrategy;
@@ -10,6 +11,9 @@ use Mpociot\ApiDoc\Tools\ResponseStrategies\TransformerTagsStrategy;
 
 class ResponseResolver
 {
+    /**
+     * @var array
+     */
     public static $strategies = [
         ResponseTagStrategy::class,
         TransformerTagsStrategy::class,
@@ -22,23 +26,48 @@ class ResponseResolver
      */
     private $route;
 
+    /**
+     * @param Route $route
+     */
     public function __construct(Route $route)
     {
         $this->route = $route;
     }
 
+    /**
+     * @param array $tags
+     * @param array $routeProps
+     *
+     * @return array
+     */
     private function resolve(array $tags, array $routeProps)
     {
         $response = null;
+
         foreach (static::$strategies as $strategy) {
             $strategy = new $strategy();
+
+            /** @var JsonResponse|array|null $response */
             $response = $strategy($this->route, $tags, $routeProps);
+
             if (! is_null($response)) {
-                return $this->getResponseContent($response);
+                if (is_array($response)) {
+                    return array_map(function (JsonResponse $response) {
+                        return ['status' => $response->getStatusCode(), 'content' => $this->getResponseContent($response)];
+                    }, $response);
+                }
+
+                return [['status' => $response->getStatusCode(), 'content' => $this->getResponseContent($response)]];
             }
         }
     }
 
+    /**
+     * @param $route
+     * @param $tags
+     * @param $routeProps
+     * @return array
+     */
     public static function getResponse($route, $tags, $routeProps)
     {
         return (new static($route))->resolve($tags, $routeProps);

+ 16 - 4
src/Tools/ResponseStrategies/ResponseFileStrategy.php

@@ -10,6 +10,13 @@ use Mpociot\Reflection\DocBlock\Tag;
  */
 class ResponseFileStrategy
 {
+    /**
+     * @param Route $route
+     * @param array $tags
+     * @param array $routeProps
+     *
+     * @return mixed
+     */
     public function __invoke(Route $route, array $tags, array $routeProps)
     {
         return $this->getFileResponse($tags);
@@ -25,15 +32,20 @@ class ResponseFileStrategy
     protected function getFileResponse(array $tags)
     {
         $responseFileTags = array_filter($tags, function ($tag) {
-            return $tag instanceof Tag && strtolower($tag->getName()) == 'responsefile';
+            return $tag instanceof Tag && strtolower($tag->getName()) === 'responsefile';
         });
+
         if (empty($responseFileTags)) {
             return;
         }
-        $responseFileTag = array_first($responseFileTags);
 
-        $json = json_decode(file_get_contents(storage_path($responseFileTag->getContent()), true), true);
+        return array_map(function ($responseFileTag) {
+            preg_match('/^(\d{3})?\s?([\s\S]*)$/', $responseFileTag->getContent(), $result);
+
+            $status = $result[1] ?: 200;
+            $content = $result[2] ? file_get_contents(storage_path($result[2]), true) : '{}';
 
-        return response()->json($json);
+            return response()->json(json_decode($content, true), (int) $status);
+        }, $responseFileTags);
     }
 }

+ 17 - 3
src/Tools/ResponseStrategies/ResponseTagStrategy.php

@@ -10,6 +10,13 @@ use Mpociot\Reflection\DocBlock\Tag;
  */
 class ResponseTagStrategy
 {
+    /**
+     * @param Route $route
+     * @param array $tags
+     * @param array $routeProps
+     *
+     * @return mixed
+     */
     public function __invoke(Route $route, array $tags, array $routeProps)
     {
         return $this->getDocBlockResponse($tags);
@@ -25,13 +32,20 @@ class ResponseTagStrategy
     protected function getDocBlockResponse(array $tags)
     {
         $responseTags = array_filter($tags, function ($tag) {
-            return $tag instanceof Tag && strtolower($tag->getName()) == 'response';
+            return $tag instanceof Tag && strtolower($tag->getName()) === 'response';
         });
+
         if (empty($responseTags)) {
             return;
         }
-        $responseTag = array_first($responseTags);
 
-        return response()->json(json_decode($responseTag->getContent(), true));
+        return array_map(function ($responseTag) {
+            preg_match('/^(\d{3})?\s?([\s\S]*)$/', $responseTag->getContent(), $result);
+
+            $status = $result[1] ?: 200;
+            $content = $result[2] ?: '{}';
+
+            return response()->json(json_decode($content, true), (int) $status);
+        }, $responseTags);
     }
 }