@@ -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}
0 commit comments