Skip to content

Commit bf6f464

Browse files
MarkVaughnmpociot
authored andcommitted
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
1 parent 2a001a4 commit bf6f464

File tree

1 file changed

+39
-1
lines changed

1 file changed

+39
-1
lines changed

src/Mpociot/ApiDoc/Generators/LaravelGenerator.php

Lines changed: 39 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,11 @@
22

33
namespace Mpociot\ApiDoc\Generators;
44

5+
use ReflectionClass;
56
use Illuminate\Routing\Route;
67
use Illuminate\Support\Facades\App;
78
use Illuminate\Support\Facades\Request;
9+
use Illuminate\Foundation\Http\FormRequest;
810

911
class LaravelGenerator extends AbstractGenerator
1012
{
@@ -34,7 +36,6 @@ public function processRoute($route, $bindings = [], $headers = [], $withRespons
3436
$routeGroup = $this->getRouteGroup($routeAction['uses']);
3537
$routeDescription = $this->getRouteDescription($routeAction['uses']);
3638

37-
3839
if ($withResponse) {
3940
$response = $this->getRouteResponse($route, $bindings, $headers);
4041
if ($response->headers->get('Content-Type') === 'application/json') {
@@ -105,4 +106,41 @@ public function callRoute($method, $uri, $parameters = [], $cookies = [], $files
105106

106107
return $response;
107108
}
109+
110+
/**
111+
* @param string $route
112+
* @param array $bindings
113+
*
114+
* @return array
115+
*/
116+
protected function getRouteRules($route, $bindings)
117+
{
118+
list($class, $method) = explode('@', $route);
119+
$reflection = new ReflectionClass($class);
120+
$reflectionMethod = $reflection->getMethod($method);
121+
122+
foreach ($reflectionMethod->getParameters() as $parameter) {
123+
$parameterType = $parameter->getClass();
124+
if (! is_null($parameterType) && class_exists($parameterType->name)) {
125+
$className = $parameterType->name;
126+
127+
if (is_subclass_of($className, FormRequest::class)) {
128+
$parameterReflection = new $className;
129+
$parameterReflection->setContainer(app());
130+
// Add route parameter bindings
131+
$parameterReflection->query->add($bindings);
132+
$parameterReflection->request->add($bindings);
133+
134+
if (method_exists($parameterReflection, 'validator')) {
135+
return app()->call([$parameterReflection, 'validator'])
136+
->getRules();
137+
} else {
138+
return app()->call([$parameterReflection, 'rules']);
139+
}
140+
}
141+
}
142+
}
143+
144+
return [];
145+
}
108146
}

0 commit comments

Comments
 (0)