diff --git a/CHANGELOG.md b/CHANGELOG.md index 1834d79c..efc62ca6 100644 --- a/CHANGELOG.md +++ b/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 diff --git a/src/Mpociot/ApiDoc/Generators/AbstractGenerator.php b/src/Mpociot/ApiDoc/Generators/AbstractGenerator.php index 49dc45c2..5e77ae5b 100644 --- a/src/Mpociot/ApiDoc/Generators/AbstractGenerator.php +++ b/src/Mpociot/ApiDoc/Generators/AbstractGenerator.php @@ -11,6 +11,7 @@ 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 @@ protected function getDocblockResponse($tags) */ 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 @@ protected function getParameters($routeData, $routeAction, $bindings) '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 @@ protected function getRouteGroup($route) } /** - * @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 @@ protected function getRouteRules($route, $bindings) $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'], []); } } } diff --git a/src/Mpociot/ApiDoc/Generators/LaravelGenerator.php b/src/Mpociot/ApiDoc/Generators/LaravelGenerator.php index 722b0ddb..ee81ba75 100644 --- a/src/Mpociot/ApiDoc/Generators/LaravelGenerator.php +++ b/src/Mpociot/ApiDoc/Generators/LaravelGenerator.php @@ -10,8 +10,6 @@ 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 @@ protected function getTransformerResponse($tags) 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 []; - } }