Skip to content

Commit 85e00ec

Browse files
authored
Merge pull request #12 from ensi-platform/task-81891
#81891 FormRequests in controllers
2 parents 8bb45ed + c0ce143 commit 85e00ec

File tree

3 files changed

+92
-8
lines changed

3 files changed

+92
-8
lines changed

src/Generators/ControllersGenerator.php

Lines changed: 32 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,10 @@ private function extractControllers(SpecObjectInterface $specObject): array
2323
$paths = $openApiData->paths ?: [];
2424
foreach ($paths as $routes) {
2525
foreach ($routes as $method => $route) {
26+
$requestName = null;
27+
$requestClassName = null;
28+
$methodWithRequest = in_array(strtoupper($method), $this->methodsWithRequests);
29+
2630
if (!empty($route->{'x-lg-skip-controller-generation'})) {
2731
continue;
2832
}
@@ -42,12 +46,21 @@ private function extractControllers(SpecObjectInterface $specObject): array
4246
'className' => $handler->class,
4347
'namespace' => $handler->namespace,
4448
'actions' => [],
49+
'requestsNamespaces' => [],
4550
];
4651
}
4752

53+
if ($methodWithRequest && empty($route->{'x-lg-skip-request-generation'})) {
54+
$requestClassName = $route->{'x-lg-request-class-name'} ?? ucfirst($route->operationId) . 'Request';
55+
$requestName = lcfirst($requestClassName);
56+
$controllers[$fqcn]['requestsNamespaces'][] = $this->getReplacedNamespace($handler->namespace, 'Controllers', 'Requests') . '\\' . ucfirst($requestClassName);
57+
} elseif ($methodWithRequest) {
58+
$controllers[$fqcn]['requestsNamespaces'][] = 'Illuminate\Http\Request';
59+
}
60+
4861
$controllers[$fqcn]['actions'][] = [
4962
'name' => $handler->method ?: '__invoke',
50-
'parameters' => array_merge($this->extractPathParameters($route), $this->getActionExtraParameters($method)),
63+
'parameters' => array_merge($this->extractPathParameters($route), $this->getActionExtraParameters($methodWithRequest, $requestName, $requestClassName)),
5164
];
5265
}
5366
}
@@ -65,11 +78,16 @@ private function extractPathParameters(stdClass $route): array
6578
], $oasRoutePath);
6679
}
6780

68-
private function getActionExtraParameters(string $method): array
81+
private function getActionExtraParameters(bool $methodWithRequest, $requestName = null, $requestClassName = null): array
6982
{
70-
return in_array(strtoupper($method), $this->methodsWithRequests)
71-
? [['name' => 'request', 'type' => 'Request']]
72-
: [];
83+
if ($methodWithRequest) {
84+
return [[
85+
'name' => $requestName ?? 'request',
86+
'type' => $requestClassName ?? 'Request',
87+
]];
88+
}
89+
90+
return [];
7391
}
7492

7593
private function createControllersFiles(array $controllers, string $template): void
@@ -104,6 +122,7 @@ public function {$methodName}({$paramsString})
104122
'{{ namespace }}' => $namespace,
105123
'{{ className }}' => $className,
106124
'{{ methods }}' => $methodsString,
125+
'{{ requestsNamespaces }}' => $this->formatRequestNamespaces($controller['requestsNamespaces']),
107126
])
108127
);
109128
}
@@ -113,4 +132,12 @@ private function formatActionParamsAsString(array $params): string
113132
{
114133
return implode(', ', array_map(fn (array $param) => $param['type'] . " $" . $param['name'], $params));
115134
}
135+
136+
protected function formatRequestNamespaces(array $namespaces): string
137+
{
138+
$namespaces = array_unique($namespaces);
139+
sort($namespaces);
140+
141+
return implode("\n", array_map(fn (string $namespaces) => "use {$namespaces};", $namespaces));
142+
}
116143
}

templates/Controller.template

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,9 @@
22

33
namespace {{ namespace }};
44

5-
use App\Http\Controllers\Controller;
6-
use Illuminate\Http\Request;
5+
{{ requestsNamespaces }}
76

8-
class {{ className }} extends Controller
7+
class {{ className }}
98
{
109
{{ methods }}
1110
}

tests/GenerateServerTest.php

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66
use Illuminate\Support\Facades\Config;
77
use function Pest\Laravel\artisan;
88
use function PHPUnit\Framework\assertEqualsCanonicalizing;
9+
use function PHPUnit\Framework\assertNotTrue;
10+
use function PHPUnit\Framework\assertStringContainsString;
911

1012
test("Command GenerateServer success", function () {
1113
/** @var TestCase $this */
@@ -50,3 +52,59 @@
5052
$this->makeFilePath('/app/Http/ApiV1/OpenApiGenerated/Enums/TestStringEnum.php'),
5153
], $putFiles);
5254
});
55+
56+
test("Correct requests in controller methods", function () {
57+
/** @var TestCase $this */
58+
$mapping = Config::get('openapi-server-generator.api_docs_mappings');
59+
$mappingValue = current($mapping);
60+
$mapping = [$this->makeFilePath(__DIR__ . '/resources/index.yaml') => $mappingValue];
61+
Config::set('openapi-server-generator.api_docs_mappings', $mapping);
62+
63+
$filesystem = $this->mock(Filesystem::class);
64+
$filesystem->shouldReceive('exists')->andReturn(false);
65+
$filesystem->shouldReceive('get')->withArgs(function ($path) {
66+
return (bool)strstr($path, '.template');
67+
})->andReturnUsing(function ($path) {
68+
return file_get_contents($path);
69+
});
70+
$filesystem->shouldReceive('cleanDirectory', 'ensureDirectoryExists');
71+
$resourceController = null;
72+
$withoutResponsesController = null;
73+
$filesystem->shouldReceive('put')->withArgs(function ($path, $content) use (&$resourceController, &$withoutResponsesController) {
74+
if (str_contains($path, 'ResourcesController.php')) {
75+
$resourceController = $content;
76+
}
77+
78+
if (str_contains($path, 'WithoutResponsesController.php')) {
79+
$withoutResponsesController = $content;
80+
}
81+
82+
return true;
83+
});
84+
85+
artisan(GenerateServer::class);
86+
87+
assertNotTrue(is_null($resourceController), 'ResourceController exist');
88+
assertStringContainsString(
89+
'use App\Http\Requests\TestFooRenameRequest',
90+
$resourceController,
91+
'ResourceController import'
92+
);
93+
assertStringContainsString(
94+
'TestFullGenerateRequest $testFullGenerateRequest',
95+
$resourceController,
96+
'ResourceController function parameter'
97+
);
98+
99+
assertNotTrue(is_null($withoutResponsesController), 'WithoutResponsesController exist');
100+
assertStringContainsString(
101+
'use Illuminate\Http\Request',
102+
$withoutResponsesController,
103+
'WithoutResponsesController import'
104+
);
105+
assertStringContainsString(
106+
'Request $request',
107+
$withoutResponsesController,
108+
'WithoutResponsesController function parameter'
109+
);
110+
});

0 commit comments

Comments
 (0)