Skip to content

Commit 8ae6290

Browse files
Merge branch 'master' into task-106821
# Conflicts: # tests/resources/schemas/test_resource_generation.yaml
2 parents 5a56809 + 2a5cdfc commit 8ae6290

File tree

7 files changed

+71
-1
lines changed

7 files changed

+71
-1
lines changed

src/Generators/BaseGenerator.php

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

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

src/Generators/ControllersGenerator.php

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,12 @@ private function extractControllers(SpecObjectInterface $specObject): array
5151

5252
if ($methodWithRequest && empty($route->{'x-lg-skip-request-generation'})) {
5353
$requestClassName = $route->{'x-lg-request-class-name'} ?? ucfirst($route->operationId) . 'Request';
54-
$controllers[$fqcn]['requestsNamespaces'][] = $this->getReplacedNamespace($handler->namespace, 'Controllers', 'Requests') . '\\' . ucfirst($requestClassName);
54+
$requestNamespace = $this->getReplacedNamespace($handler->namespace, 'Controllers', 'Requests');
55+
56+
list($requestClassName, $requestNamespace) = $this->getActualClassNameAndNamespace($requestClassName, $requestNamespace);
57+
$requestNamespace .= '\\' . ucfirst($requestClassName);
58+
59+
$controllers[$fqcn]['requestsNamespaces'][] = $requestNamespace;
5560
} elseif ($methodWithRequest) {
5661
$controllers[$fqcn]['requestsNamespaces'][] = 'Illuminate\Http\Request';
5762
}

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
@@ -37,11 +37,14 @@
3737
assertEqualsCanonicalizing([
3838
$this->makeFilePath('/app/Http/ApiV1/OpenApiGenerated/routes.php'),
3939

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

46+
$this->makeFilePath('/app/Http/Requests/WithDirRequests/Request.php'),
47+
$this->makeFilePath('/app/Http/Requests/Foo/TestNamespaceWithDirRequest.php'),
4548
$this->makeFilePath('/app/Http/Requests/LaravelValidationsApplicationJsonRequest.php'),
4649
$this->makeFilePath('/app/Http/Requests/LaravelValidationsMultipartFormDataRequest.php'),
4750
$this->makeFilePath('/app/Http/Requests/LaravelValidationsNonAvailableContentTypeRequest.php'),
@@ -57,7 +60,10 @@
5760

5861
$this->makeFilePath('/app/Http/Resources/ResourcesResource.php'),
5962
$this->makeFilePath('/app/Http/Resources/ResourcesDataDataResource.php'),
63+
$this->makeFilePath('/app/Http/Resources/Foo/ResourcesDataDataResource.php'),
6064
$this->makeFilePath('/app/Http/Resources/ResourceRootResource.php'),
65+
$this->makeFilePath('/app/Http/Resources/Foo/WithDirResource.php'),
66+
$this->makeFilePath('/app/Http/Tests/Foo/TestComponentTest.php'),
6167

6268
$this->makeFilePath('/app/Http/Requests/TestRenameFromKeyRequestRequest.php'),
6369
$this->makeFilePath('/app/Http/Resources/ResourcesDataWithNameResource.php'),
@@ -158,6 +164,7 @@
158164
assertStringContainsString(
159165
"use App\Http\Controllers\Controller11;\n".
160166
"use App\Http\Controllers\Controller2;\n".
167+
"use App\Http\Controllers\Foo\TestController;\n" .
161168
"use App\Http\Controllers\FooItemsController;\n".
162169
"use App\Http\Controllers\FoosController;\n",
163170
$routes

tests/resources/index.yaml

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,29 @@ paths:
158158
application/json:
159159
schema:
160160
$ref: './schemas/test_resource_generation.yaml#/GenerateResourceWithoutPropertiesResponse'
161+
/resources:test-class-name-with-dir:
162+
post:
163+
operationId: testNamespaceWithDir
164+
x-lg-handler: '\App\Http\Controllers\Foo\TestController@testNamespaceWithDirRequest'
165+
x-lg-request-class-name: 'WithDirRequests/Request'
166+
responses:
167+
"200":
168+
description: Успешный ответ c контекстом
169+
content:
170+
application/json:
171+
schema:
172+
$ref: './schemas/test_resource_generation.yaml#/ResourceDataDataResponse'
173+
/resources:test-resource-class-name-with-dir:
174+
post:
175+
operationId: testNamespaceWithDir
176+
x-lg-handler: '\App\Http\Controllers\Foo\TestController@testNamespaceWithDirResource'
177+
responses:
178+
"200":
179+
description: Успешный ответ c контекстом
180+
content:
181+
application/json:
182+
schema:
183+
$ref: './schemas/test_resource_generation.yaml#/ResourceWithDirResponse'
161184
/policies:test-generate-policy-method-foo:
162185
post:
163186
operationId: generatePolicyMethodFoo

tests/resources/schemas/test_resource_generation.yaml

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,16 @@ ResourceDataDataResponse:
4444
data:
4545
$ref: '#/ResourceForTestResourceGeneration'
4646

47+
ResourceWithDirResponse:
48+
type: object
49+
x-lg-resource-response-key: data.data
50+
x-lg-resource-class-name: Foo/WithDirResource
51+
properties:
52+
data:
53+
properties:
54+
data:
55+
$ref: '#/ResourceForTestResourceGeneration'
56+
4757
ResourceDataWithNameResponse:
4858
type: object
4959
x-lg-resource-response-key: data.test

0 commit comments

Comments
 (0)