فهرست منبع

Added '@hideFromAPIDocumentation' tag

Marcel Pociot 8 سال پیش
والد
کامیت
64714c7cd9
3فایلهای تغییر یافته به همراه45 افزوده شده و 3 حذف شده
  1. 24 2
      src/Mpociot/ApiDoc/Commands/GenerateDocumentation.php
  2. 8 0
      tests/Fixtures/TestController.php
  3. 13 1
      tests/GenerateDocumentationTest.php

+ 24 - 2
src/Mpociot/ApiDoc/Commands/GenerateDocumentation.php

@@ -10,6 +10,8 @@ use Mpociot\ApiDoc\Generators\DingoGenerator;
 use Mpociot\ApiDoc\Generators\LaravelGenerator;
 use Mpociot\ApiDoc\Postman\CollectionWriter;
 use Mpociot\Documentarian\Documentarian;
+use Mpociot\Reflection\DocBlock;
+use ReflectionClass;
 
 class GenerateDocumentation extends Command
 {
@@ -223,11 +225,11 @@ class GenerateDocumentation extends Command
         $parsedRoutes = [];
         foreach ($routes as $route) {
             if (in_array($route->getName(), $allowedRoutes) || str_is($routePrefix, $route->getUri())) {
-                if ($this->isValidRoute($route)) {
+                if ($this->isValidRoute($route) && $this->isRouteVisibleForDocumentation($route->getAction()['uses'])) {
                     $parsedRoutes[] = $generator->processRoute($route, $bindings, $withResponse);
                     $this->info('Processed route: '.$route->getUri());
                 } else {
-                    $this->warn('Skipping route: '.$route->getUri().' - contains closure.');
+                    $this->warn('Skipping route: '.$route->getUri());
                 }
             }
         }
@@ -268,6 +270,26 @@ class GenerateDocumentation extends Command
         return ! is_callable($route->getAction()['uses']) && ! is_null($route->getAction()['uses']);
     }
 
+    /**
+     * @param $route
+     * @return boolean
+     */
+    private function isRouteVisibleForDocumentation($route)
+    {
+        list($class, $method) = explode('@', $route);
+        $reflection = new ReflectionClass($class);
+        $comment = $reflection->getMethod($method)->getDocComment();
+        if ($comment) {
+            $phpdoc = new DocBlock($comment);
+            return collect($phpdoc->getTags())
+                ->filter(function($tag) use ($route){
+                    return $tag->getName() === 'hideFromAPIDocumentation';
+                })
+                ->isEmpty();
+        }
+        return true;
+    }
+
     /**
      * Generate Postman collection JSON file.
      *

+ 8 - 0
tests/Fixtures/TestController.php

@@ -53,4 +53,12 @@ class TestController extends Controller
     {
         return '';
     }
+
+    /**
+     * @hideFromAPIDocumentation
+     */
+    public function skip()
+    {
+        
+    }
 }

+ 13 - 1
tests/GenerateDocumentationTest.php

@@ -58,7 +58,19 @@ class GenerateDocumentationTest extends TestCase
         $output = $this->artisan('api:generate', [
             '--routePrefix' => 'api/*',
         ]);
-        $this->assertContains('Skipping route: api/closure - contains closure.', $output);
+        $this->assertContains('Skipping route: api/closure', $output);
+        $this->assertContains('Processed route: api/test', $output);
+    }
+
+    public function testCanSkipSingleRoutesCommandDoesNotWorkWithClosure()
+    {
+        RouteFacade::get('/api/skip', TestController::class.'@skip');
+        RouteFacade::get('/api/test', TestController::class.'@parseMethodDescription');
+
+        $output = $this->artisan('api:generate', [
+            '--routePrefix' => 'api/*',
+        ]);
+        $this->assertContains('Skipping route: api/skip', $output);
         $this->assertContains('Processed route: api/test', $output);
     }