浏览代码

Add resources response field tags to documentation

Fehérvári Norbert 2 年之前
父节点
当前提交
42248b16a0
共有 2 个文件被更改,包括 50 次插入2 次删除
  1. 49 1
      src/Extracting/Strategies/ResponseFields/GetFromResponseFieldTag.php
  2. 1 1
      src/Writing/Writer.php

+ 49 - 1
src/Extracting/Strategies/ResponseFields/GetFromResponseFieldTag.php

@@ -8,6 +8,8 @@ use Knuckles\Camel\Extraction\ResponseCollection;
 use Knuckles\Scribe\Extracting\ParamHelpers;
 use Knuckles\Scribe\Extracting\RouteDocBlocker;
 use Knuckles\Scribe\Extracting\Strategies\Strategy;
+use Knuckles\Scribe\Tools\Utils as u;
+use Mpociot\Reflection\DocBlock;
 use Mpociot\Reflection\DocBlock\Tag;
 
 class GetFromResponseFieldTag extends Strategy
@@ -18,7 +20,35 @@ class GetFromResponseFieldTag extends Strategy
     {
         $methodDocBlock = RouteDocBlocker::getDocBlocksFromRoute($endpointData->route)['method'];
 
-        return $this->getResponseFieldsFromDocBlock($methodDocBlock->getTags(), $endpointData->responses);
+        return $this->getResponseFieldsFromDocBlock($this->getMergedTags($methodDocBlock->getTags()), $endpointData->responses);
+    }
+
+    /**
+     * Get method and api resource tags
+     *
+     * @param array $tags
+     * @return array
+     * @throws \ReflectionException
+     */
+    public function getMergedTags(array $tags): array
+    {
+        $responseFieldTags = [];
+
+        if ($apiResourceTag = $this->getApiResourceTag($tags)) {
+            $className = $apiResourceTag->getContent();
+
+            if (!empty($className)) {
+                $method = u::getReflectedRouteMethod([$className, 'toArray']);
+                $docBlock = new DocBlock($method->getDocComment() ?: '');
+                $responseFieldTags = $docBlock->getTags();
+
+                if (!empty($responseFieldTags)) {
+                    return array_merge($tags, $responseFieldTags);
+                }
+            }
+        }
+
+        return $tags;
     }
 
     /**
@@ -85,4 +115,22 @@ class GetFromResponseFieldTag extends Strategy
 
         return $parameters;
     }
+
+    /**
+     * Get api resource tag.
+     *
+     * @param Tag[] $tags
+     *
+     * @return Tag|null
+     */
+    public function getApiResourceTag(array $tags): ?Tag
+    {
+        $apiResourceTags = array_values(
+            array_filter($tags, function ($tag) {
+                return ($tag instanceof Tag) && in_array(strtolower($tag->getName()), ['apiresource', 'apiresourcecollection']);
+            })
+        );
+
+        return empty($apiResourceTags) ? null : $apiResourceTags[0];
+    }
 }

+ 1 - 1
src/Writing/Writer.php

@@ -44,7 +44,7 @@ class Writer
     {
         $this->docsName = $docsName;
         $this->markdownOutputPath = ".{$docsName}"; //.scribe by default
-        $this->laravelTypeOutputPath = "resources/views/$docsName";
+        $this->laravelTypeOutputPath = function_exists('base_path') ? base_path("resources/views/$docsName") : "resources/views/$docsName";
         // If no config is injected, pull from global. Makes testing easier.
         $this->config = $config ?: new DocumentationConfig(config($docsName));