1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495 |
- <?php
- namespace Mpociot\ApiDoc\Strategies\QueryParameters;
- use ReflectionClass;
- use ReflectionMethod;
- use Illuminate\Support\Str;
- use Illuminate\Routing\Route;
- use Mpociot\Reflection\DocBlock;
- use Mpociot\Reflection\DocBlock\Tag;
- use Mpociot\ApiDoc\Strategies\Strategy;
- use Mpociot\ApiDoc\Tools\RouteDocBlocker;
- use Dingo\Api\Http\FormRequest as DingoFormRequest;
- use Mpociot\ApiDoc\Tools\Traits\DocBlockParamHelpers;
- use Illuminate\Foundation\Http\FormRequest as LaravelFormRequest;
- class GetFromQueryParamTag extends Strategy
- {
- use DocBlockParamHelpers;
- public function __invoke(Route $route, ReflectionClass $controller, ReflectionMethod $method, array $routeRules, array $context = [])
- {
- foreach ($method->getParameters() as $param) {
- $paramType = $param->getType();
- if ($paramType === null) {
- continue;
- }
- $parameterClassName = $paramType->getName();
- try {
- $parameterClass = new ReflectionClass($parameterClassName);
- } catch (\ReflectionException $e) {
- continue;
- }
- // If there's a FormRequest, we check there for @queryParam tags.
- if (class_exists(LaravelFormRequest::class) && $parameterClass->isSubclassOf(LaravelFormRequest::class)
- || class_exists(DingoFormRequest::class) && $parameterClass->isSubclassOf(DingoFormRequest::class)) {
- $formRequestDocBlock = new DocBlock($parameterClass->getDocComment());
- $queryParametersFromDocBlock = $this->getQueryParametersFromDocBlock($formRequestDocBlock->getTags());
- if (count($queryParametersFromDocBlock)) {
- return $queryParametersFromDocBlock;
- }
- }
- }
- $methodDocBlock = RouteDocBlocker::getDocBlocksFromRoute($route)['method'];
- return $this->getQueryParametersFromDocBlock($methodDocBlock->getTags());
- }
- private function getQueryParametersFromDocBlock($tags)
- {
- $parameters = collect($tags)
- ->filter(function ($tag) {
- return $tag instanceof Tag && $tag->getName() === 'queryParam';
- })
- ->mapWithKeys(function ($tag) {
- // Format:
- // @queryParam <name> <"required" (optional)> <description>
- // Examples:
- // @queryParam text string required The text.
- // @queryParam user_id The ID of the user.
- preg_match('/(.+?)\s+(required\s+)?(.*)/', $tag->getContent(), $content);
- $content = preg_replace('/\s?No-example.?/', '', $content);
- if (empty($content)) {
- // this means only name was supplied
- list($name) = preg_split('/\s+/', $tag->getContent());
- $required = false;
- $description = '';
- } else {
- list($_, $name, $required, $description) = $content;
- $description = trim($description);
- if ($description == 'required' && empty(trim($required))) {
- $required = $description;
- $description = '';
- }
- $required = trim($required) == 'required' ? true : false;
- }
- list($description, $value) = $this->parseParamDescription($description, 'string');
- if (is_null($value) && ! $this->shouldExcludeExample($tag)) {
- $value = Str::contains($description, ['number', 'count', 'page'])
- ? $this->generateDummyValue('integer')
- : $this->generateDummyValue('string');
- }
- return [$name => compact('description', 'required', 'value')];
- })->toArray();
- return $parameters;
- }
- }
|