Skip to content

Commit 444c260

Browse files
author
Kapitanov Andrey
committed
#104744
2 parents 09f439a + 2a5cdfc commit 444c260

File tree

7 files changed

+71
-2
lines changed

7 files changed

+71
-2
lines changed

src/Generators/BaseGenerator.php

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,4 +115,25 @@ private function formattedGlobalParams(): array
115115

116116
return $params;
117117
}
118+
119+
protected function getActualClassNameAndNamespace(?string $className, ?string $namespace): array
120+
{
121+
$parseClassName = explode('/', $className);
122+
123+
if (count($parseClassName) > 1) {
124+
if (str_contains($namespace, '\Requests')) {
125+
$namespace = substr($namespace, 0, strpos($namespace, '\Requests') + 9);
126+
} elseif (str_contains($namespace, '\Resources')) {
127+
$namespace = substr($namespace, 0, strpos($namespace, '\Resources') + 10);
128+
}
129+
130+
$className = array_pop($parseClassName);
131+
$namespace .= '\\' . implode('\\', $parseClassName);
132+
}
133+
134+
return [
135+
$className,
136+
$namespace,
137+
];
138+
}
118139
}

src/Generators/ControllersGenerator.php

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -61,8 +61,12 @@ private function extractControllers(SpecObjectInterface $specObject): array
6161

6262
if ($methodWithRequest && empty($route->{'x-lg-skip-request-generation'})) {
6363
$requestClassName = $route->{'x-lg-request-class-name'} ?? ucfirst($route->operationId) . 'Request';
64-
$namespace = $this->getReplacedNamespace($handler->namespace, 'Controllers', 'Requests') . '\\' . ucfirst($requestClassName);
65-
$controllers[$fqcn]['requestsNamespaces'][$namespace] = $namespace;
64+
$requestNamespace = $this->getReplacedNamespace($handler->namespace, 'Controllers', 'Requests');
65+
66+
list($requestClassName, $requestNamespace) = $this->getActualClassNameAndNamespace($requestClassName, $requestNamespace);
67+
$requestNamespace .= '\\' . ucfirst($requestClassName);
68+
69+
$controllers[$fqcn]['requestsNamespaces'][$requestNamespace] = $requestNamespace;
6670
}
6771

6872
$responses = $route->responses ?? null;

src/Generators/RequestsGenerator.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,8 @@ protected function extractRequests(SpecObjectInterface $specObject, array $names
5656
continue;
5757
}
5858

59+
list($className, $newNamespace) = $this->getActualClassNameAndNamespace($className, $newNamespace);
60+
5961
$validationRules = '//';
6062
$usesEnums = '';
6163
if (std_object_has($route, 'requestBody')) {

src/Generators/ResourcesGenerator.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,8 @@ protected function extractResources(SpecObjectInterface $specObject): array
5252
continue;
5353
}
5454

55+
list($className, $namespace) = $this->getActualClassNameAndNamespace($className, $namespace);
56+
5557
if (isset($resources["$namespace\\$className"])) {
5658
continue;
5759
}

tests/GenerateServerTest.php

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,11 +39,14 @@
3939
assertEqualsCanonicalizing([
4040
$this->makeFilePath('/app/Http/ApiV1/OpenApiGenerated/routes.php'),
4141

42+
$this->makeFilePath('/app/Http/Controllers/Foo/TestController.php'),
4243
$this->makeFilePath('/app/Http/Controllers/ResourcesController.php'),
4344
$this->makeFilePath('/app/Http/Requests/TestFullGenerateRequest.php'),
4445
$this->makeFilePath('/app/Http/Tests/ResourcesComponentTest.php'),
4546
$this->makeFilePath('/app/Http/Requests/TestFooRenameRequest.php'),
4647

48+
$this->makeFilePath('/app/Http/Requests/WithDirRequests/Request.php'),
49+
$this->makeFilePath('/app/Http/Requests/Foo/TestNamespaceWithDirRequest.php'),
4750
$this->makeFilePath('/app/Http/Requests/LaravelValidationsApplicationJsonRequest.php'),
4851
$this->makeFilePath('/app/Http/Requests/LaravelValidationsMultipartFormDataRequest.php'),
4952
$this->makeFilePath('/app/Http/Requests/LaravelValidationsNonAvailableContentTypeRequest.php'),
@@ -59,7 +62,10 @@
5962

6063
$this->makeFilePath('/app/Http/Resources/ResourcesResource.php'),
6164
$this->makeFilePath('/app/Http/Resources/ResourcesDataDataResource.php'),
65+
$this->makeFilePath('/app/Http/Resources/Foo/ResourcesDataDataResource.php'),
6266
$this->makeFilePath('/app/Http/Resources/ResourceRootResource.php'),
67+
$this->makeFilePath('/app/Http/Resources/Foo/WithDirResource.php'),
68+
$this->makeFilePath('/app/Http/Tests/Foo/TestComponentTest.php'),
6369

6470
$this->makeFilePath('/app/Http/Controllers/Controller11.php'),
6571
$this->makeFilePath('/app/Http/Controllers/Controller2.php'),
@@ -157,6 +163,7 @@
157163
assertStringContainsString(
158164
"use App\Http\Controllers\Controller11;\n".
159165
"use App\Http\Controllers\Controller2;\n".
166+
"use App\Http\Controllers\Foo\TestController;\n" .
160167
"use App\Http\Controllers\FooItemsController;\n".
161168
"use App\Http\Controllers\FoosController;\n",
162169
$routes

tests/resources/index.yaml

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,29 @@ paths:
147147
application/json:
148148
schema:
149149
$ref: './schemas/test_resource_generation.yaml#/GenerateResourceWithoutPropertiesResponse'
150+
/resources:test-class-name-with-dir:
151+
post:
152+
operationId: testNamespaceWithDir
153+
x-lg-handler: '\App\Http\Controllers\Foo\TestController@testNamespaceWithDirRequest'
154+
x-lg-request-class-name: 'WithDirRequests/Request'
155+
responses:
156+
"200":
157+
description: Успешный ответ c контекстом
158+
content:
159+
application/json:
160+
schema:
161+
$ref: './schemas/test_resource_generation.yaml#/ResourceDataDataResponse'
162+
/resources:test-resource-class-name-with-dir:
163+
post:
164+
operationId: testNamespaceWithDir
165+
x-lg-handler: '\App\Http\Controllers\Foo\TestController@testNamespaceWithDirResource'
166+
responses:
167+
"200":
168+
description: Успешный ответ c контекстом
169+
content:
170+
application/json:
171+
schema:
172+
$ref: './schemas/test_resource_generation.yaml#/ResourceWithDirResponse'
150173
/policies:test-generate-policy-method-foo:
151174
post:
152175
operationId: generatePolicyMethodFoo

tests/resources/schemas/test_resource_generation.yaml

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,16 @@ ResourceDataDataResponse:
3737
data:
3838
$ref: '#/ResourceForTestResourceGeneration'
3939

40+
ResourceWithDirResponse:
41+
type: object
42+
x-lg-resource-response-key: data.data
43+
x-lg-resource-class-name: Foo/WithDirResource
44+
properties:
45+
data:
46+
properties:
47+
data:
48+
$ref: '#/ResourceForTestResourceGeneration'
49+
4050
ResourceRootResponse:
4151
type: object
4252
x-lg-resource-response-key: false

0 commit comments

Comments
 (0)