浏览代码

Allow DI for validator/rules methods (#134)

setContainer(app())
dependency injection via app()->call()

Follow Style CI

Fix unrelated style

Use import

Style CI

Import

Style-ci
Mark 8 年之前
父节点
当前提交
bf6f464863
共有 1 个文件被更改,包括 39 次插入1 次删除
  1. 39 1
      src/Mpociot/ApiDoc/Generators/LaravelGenerator.php

+ 39 - 1
src/Mpociot/ApiDoc/Generators/LaravelGenerator.php

@@ -2,9 +2,11 @@
 
 namespace Mpociot\ApiDoc\Generators;
 
+use ReflectionClass;
 use Illuminate\Routing\Route;
 use Illuminate\Support\Facades\App;
 use Illuminate\Support\Facades\Request;
+use Illuminate\Foundation\Http\FormRequest;
 
 class LaravelGenerator extends AbstractGenerator
 {
@@ -34,7 +36,6 @@ class LaravelGenerator extends AbstractGenerator
         $routeGroup = $this->getRouteGroup($routeAction['uses']);
         $routeDescription = $this->getRouteDescription($routeAction['uses']);
 
-
         if ($withResponse) {
             $response = $this->getRouteResponse($route, $bindings, $headers);
             if ($response->headers->get('Content-Type') === 'application/json') {
@@ -105,4 +106,41 @@ class LaravelGenerator extends AbstractGenerator
 
         return $response;
     }
+
+    /**
+     * @param  string $route
+     * @param  array $bindings
+     *
+     * @return array
+     */
+    protected function getRouteRules($route, $bindings)
+    {
+        list($class, $method) = explode('@', $route);
+        $reflection = new ReflectionClass($class);
+        $reflectionMethod = $reflection->getMethod($method);
+
+        foreach ($reflectionMethod->getParameters() as $parameter) {
+            $parameterType = $parameter->getClass();
+            if (! is_null($parameterType) && class_exists($parameterType->name)) {
+                $className = $parameterType->name;
+
+                if (is_subclass_of($className, FormRequest::class)) {
+                    $parameterReflection = new $className;
+                    $parameterReflection->setContainer(app());
+                    // Add route parameter bindings
+                    $parameterReflection->query->add($bindings);
+                    $parameterReflection->request->add($bindings);
+
+                    if (method_exists($parameterReflection, 'validator')) {
+                        return app()->call([$parameterReflection, 'validator'])
+                            ->getRules();
+                    } else {
+                        return app()->call([$parameterReflection, 'rules']);
+                    }
+                }
+            }
+        }
+
+        return [];
+    }
 }