Bläddra i källkod

Merge pull request #314 from shalvah/set-method-on-form-request

Set correct HTTP method when parsing FormRequest (fixes #260)
Shalvah A 6 år sedan
förälder
incheckning
41a88d5cbd

+ 1 - 0
CHANGELOG.md

@@ -10,6 +10,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
 ### Changed
 
 ### Fixed
+- Set correct HTTP method when parsing FormRequest
 
 ### Removed
 

+ 20 - 15
src/Mpociot/ApiDoc/Generators/AbstractGenerator.php

@@ -11,6 +11,7 @@ use Mpociot\Reflection\DocBlock\Tag;
 use Illuminate\Support\Facades\Validator;
 use Illuminate\Foundation\Http\FormRequest;
 use Mpociot\ApiDoc\Parsers\RuleDescriptionParser as Description;
+use Illuminate\Contracts\Validation\Factory as ValidationFactory;
 
 abstract class AbstractGenerator
 {
@@ -86,9 +87,9 @@ abstract class AbstractGenerator
      */
     protected function getParameters($routeData, $routeAction, $bindings)
     {
-        $rules = $this->simplifyRules($this->getRouteRules($routeAction['uses'], $bindings));
+        $rules = $this->simplifyRules($this->getRouteRules($routeData['methods'], $routeAction['uses'], $bindings));
 
-        foreach ($rules as $attribute => $rules) {
+        foreach ($rules as $attribute => $ruleset) {
             $attributeData = [
                 'required' => false,
                 'type' => null,
@@ -96,8 +97,7 @@ abstract class AbstractGenerator
                 'value' => '',
                 'description' => [],
             ];
-
-            foreach ($rules as $ruleName => $rule) {
+            foreach ($ruleset as $rule) {
                 $this->parseRule($rule, $attribute, $attributeData, $routeData['id']);
             }
             $routeData['parameters'][$attribute] = $attributeData;
@@ -220,14 +220,14 @@ abstract class AbstractGenerator
     }
 
     /**
-     * @param  $route
+     * @param  array $routeMethods
+     * @param  string $routeAction
      * @param  array $bindings
-     *
      * @return array
      */
-    protected function getRouteRules($route, $bindings)
+    protected function getRouteRules(array $routeMethods, $routeAction, $bindings)
     {
-        list($class, $method) = explode('@', $route);
+        list($class, $method) = explode('@', $routeAction);
         $reflection = new ReflectionClass($class);
         $reflectionMethod = $reflection->getMethod($method);
 
@@ -237,15 +237,20 @@ abstract class AbstractGenerator
                 $className = $parameterType->name;
 
                 if (is_subclass_of($className, FormRequest::class)) {
-                    $parameterReflection = new $className;
+                    /** @var FormRequest $formRequest */
+                    $formRequest = new $className;
                     // Add route parameter bindings
-                    $parameterReflection->query->add($bindings);
-                    $parameterReflection->request->add($bindings);
-
-                    if (method_exists($parameterReflection, 'validator')) {
-                        return $parameterReflection->validator()->getRules();
+                    $formRequest->setContainer(app());
+                    $formRequest->request->add($bindings);
+                    $formRequest->query->add($bindings);
+                    $formRequest->setMethod($routeMethods[0]);
+
+                    if (method_exists($formRequest, 'validator')) {
+                        $factory = app(ValidationFactory::class);
+                        return call_user_func_array([$formRequest, 'validator'], [$factory])
+                            ->getRules();
                     } else {
-                        return $parameterReflection->rules();
+                        return call_user_func_array([$formRequest, 'rules'], []);
                     }
                 }
             }

+ 0 - 41
src/Mpociot/ApiDoc/Generators/LaravelGenerator.php

@@ -10,8 +10,6 @@ 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;
-use Illuminate\Contracts\Validation\Factory as ValidationFactory;
 
 class LaravelGenerator extends AbstractGenerator
 {
@@ -253,43 +251,4 @@ class LaravelGenerator extends AbstractGenerator
             return;
         }
     }
-
-    /**
-     * @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')) {
-                        $factory = app()->make(ValidationFactory::class);
-
-                        return app()->call([$parameterReflection, 'validator'], [$factory])
-                            ->getRules();
-                    } else {
-                        return app()->call([$parameterReflection, 'rules']);
-                    }
-                }
-            }
-        }
-
-        return [];
-    }
 }