Skip to content

Commit 318ae2b

Browse files
added operation transformers api
1 parent 820d1dd commit 318ae2b

File tree

12 files changed

+74
-283
lines changed

12 files changed

+74
-283
lines changed

src/Configuration/OperationTransformers.php

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
namespace Dedoc\Scramble\Configuration;
44

5+
use Dedoc\Scramble\Support\OperationExtensions\DeprecationExtension;
6+
use Dedoc\Scramble\Support\OperationExtensions\ErrorResponsesExtension;
57
use Dedoc\Scramble\Support\OperationExtensions\RequestBodyExtension;
68
use Dedoc\Scramble\Support\OperationExtensions\RequestEssentialsExtension;
79
use Dedoc\Scramble\Support\OperationExtensions\ResponseExtension;
@@ -47,13 +49,15 @@ public function all(): array
4749
$base = $this->transformers ?: [
4850
RequestEssentialsExtension::class,
4951
RequestBodyExtension::class,
52+
ErrorResponsesExtension::class,
5053
ResponseExtension::class,
54+
DeprecationExtension::class,
5155
];
5256

5357
return array_values(array_unique([
5458
...$this->prepends,
5559
...$base,
5660
...$this->appends,
57-
]));
61+
], SORT_REGULAR));
5862
}
5963
}

src/Contexts/OperationTransformerContext.php

Lines changed: 0 additions & 20 deletions
This file was deleted.

src/Contracts/OperationTransformer.php

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

33
namespace Dedoc\Scramble\Contracts;
44

5-
use Dedoc\Scramble\Contexts\OperationTransformerContext;
65
use Dedoc\Scramble\Support\Generator\Operation;
6+
use Dedoc\Scramble\Support\RouteInfo;
77

88
interface OperationTransformer
99
{
10-
public function handle(Operation $operation, OperationTransformerContext $context);
10+
public function handle(Operation $operation, RouteInfo $routeInfo);
1111
}

src/Extensions/OperationExtension.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,14 @@
22

33
namespace Dedoc\Scramble\Extensions;
44

5+
use Dedoc\Scramble\Contracts\OperationTransformer;
56
use Dedoc\Scramble\GeneratorConfig;
67
use Dedoc\Scramble\Infer;
78
use Dedoc\Scramble\Support\Generator\Operation;
89
use Dedoc\Scramble\Support\Generator\TypeTransformer;
910
use Dedoc\Scramble\Support\RouteInfo;
1011

11-
abstract class OperationExtension
12+
abstract class OperationExtension implements OperationTransformer
1213
{
1314
public function __construct(
1415
protected Infer $infer,

src/Generator.php

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,9 @@
44

55
use Dedoc\Scramble\Attributes\ExcludeAllRoutesFromDocs;
66
use Dedoc\Scramble\Attributes\ExcludeRouteFromDocs;
7-
use Dedoc\Scramble\Contexts\OperationTransformerContext;
87
use Dedoc\Scramble\Exceptions\RouteAware;
98
use Dedoc\Scramble\Infer\Services\FileParser;
109
use Dedoc\Scramble\OpenApiVisitor\SchemaEnforceVisitor;
11-
use Dedoc\Scramble\Reflections\ReflectionRoute;
1210
use Dedoc\Scramble\Support\Generator\Components;
1311
use Dedoc\Scramble\Support\Generator\InfoObject;
1412
use Dedoc\Scramble\Support\Generator\OpenApi;
@@ -36,6 +34,7 @@ class Generator
3634
public function __construct(
3735
private OperationBuilder $operationBuilder,
3836
private ServerFactory $serverFactory,
37+
private FileParser $fileParser,
3938
private Infer $infer
4039
) {}
4140

@@ -203,13 +202,13 @@ private function buildTypeTransformer(OpenApiContext $context): TypeTransformer
203202

204203
private function routeToOperation(OpenApi $openApi, Route $route, GeneratorConfig $config, TypeTransformer $typeTransformer)
205204
{
206-
$reflectionRoute = new ReflectionRoute($route, $this->infer, $typeTransformer);
205+
$routeInfo = new RouteInfo($route, $this->infer, $typeTransformer);
207206

208-
if (! $reflectionRoute->isControllerAction()) {
207+
if (! $routeInfo->isClassBased()) {
209208
return null;
210209
}
211210

212-
$operation = $this->operationBuilder->build($reflectionRoute, $openApi, $config, $typeTransformer);
211+
$operation = $this->operationBuilder->build($routeInfo, $openApi, $config, $typeTransformer);
213212

214213
$this->ensureSchemaTypes($route, $operation);
215214

src/OperationTransformers/ExtensionWrapperTransformer.php

Lines changed: 0 additions & 32 deletions
This file was deleted.

src/Reflections/ReflectionRoute.php

Lines changed: 0 additions & 122 deletions
This file was deleted.

src/ScrambleServiceProvider.php

Lines changed: 9 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
use Dedoc\Scramble\Support\ExceptionToResponseExtensions\HttpExceptionToResponseExtension;
2323
use Dedoc\Scramble\Support\ExceptionToResponseExtensions\NotFoundExceptionToResponseExtension;
2424
use Dedoc\Scramble\Support\ExceptionToResponseExtensions\ValidationExceptionToResponseExtension;
25+
use Dedoc\Scramble\Support\Generator\Operation;
2526
use Dedoc\Scramble\Support\Generator\TypeTransformer;
2627
use Dedoc\Scramble\Support\IndexBuilders\IndexBuilder;
2728
use Dedoc\Scramble\Support\InferExtensions\AbortHelpersExceptionInfer;
@@ -38,14 +39,14 @@
3839
use Dedoc\Scramble\Support\InferExtensions\ResponseMethodReturnTypeExtension;
3940
use Dedoc\Scramble\Support\InferExtensions\TypeTraceInfer;
4041
use Dedoc\Scramble\Support\InferExtensions\ValidatorTypeInfer;
41-
use Dedoc\Scramble\Support\OperationBuilder;
4242
use Dedoc\Scramble\Support\OperationExtensions\DeprecationExtension;
4343
use Dedoc\Scramble\Support\OperationExtensions\ErrorResponsesExtension;
4444
use Dedoc\Scramble\Support\OperationExtensions\ParameterExtractor\AttributesParametersExtractor;
4545
use Dedoc\Scramble\Support\OperationExtensions\ParameterExtractor\MethodCallsParametersExtractor;
4646
use Dedoc\Scramble\Support\OperationExtensions\RequestBodyExtension;
4747
use Dedoc\Scramble\Support\OperationExtensions\RequestEssentialsExtension;
4848
use Dedoc\Scramble\Support\OperationExtensions\ResponseExtension;
49+
use Dedoc\Scramble\Support\RouteInfo;
4950
use Dedoc\Scramble\Support\ServerFactory;
5051
use Dedoc\Scramble\Support\TypeToSchemaExtensions\AnonymousResourceCollectionTypeToSchema;
5152
use Dedoc\Scramble\Support\TypeToSchemaExtensions\CollectionToSchema;
@@ -139,25 +140,6 @@ public function configurePackage(Package $package): void
139140
);
140141
});
141142

142-
$this->app->when(OperationBuilder::class)
143-
->needs('$extensionsClasses')
144-
->give(function () {
145-
$extensions = array_merge(config('scramble.extensions', []), Scramble::$extensions);
146-
147-
$operationExtensions = array_values(array_filter(
148-
$extensions,
149-
fn ($e) => is_a($e, OperationExtension::class, true),
150-
));
151-
152-
return array_merge([
153-
RequestEssentialsExtension::class,
154-
RequestBodyExtension::class,
155-
ErrorResponsesExtension::class,
156-
ResponseExtension::class,
157-
DeprecationExtension::class,
158-
], $operationExtensions);
159-
});
160-
161143
$this->app->when(IndexBuildingBroker::class)
162144
->needs('$indexBuilders')
163145
->give(function () {
@@ -214,12 +196,8 @@ public function configurePackage(Package $package): void
214196
], $exceptionToResponseExtensions),
215197
);
216198
});
217-
}
218199

219-
public function bootingPackage()
220-
{
221200
Scramble::configure()
222-
->useConfig(config('scramble'))
223201
->withOperationTransformers(function (OperationTransformers $transformers) {
224202
$extensions = array_merge(config('scramble.extensions', []), Scramble::$extensions);
225203

@@ -228,18 +206,14 @@ public function bootingPackage()
228206
fn ($e) => is_a($e, OperationExtension::class, true),
229207
));
230208

231-
$operationExtensions = array_merge([
232-
RequestEssentialsExtension::class,
233-
RequestBodyExtension::class,
234-
ErrorResponsesExtension::class,
235-
ResponseExtension::class,
236-
DeprecationExtension::class,
237-
], $operationExtensions);
238-
239-
$transformers->append(array_map(function ($extension) {
240-
return new ExtensionWrapperTransformer($extension);
241-
}, $operationExtensions));
209+
$transformers->append($operationExtensions);
242210
});
211+
}
212+
213+
public function bootingPackage()
214+
{
215+
Scramble::configure()
216+
->useConfig(config('scramble'));
243217

244218
$this->app->booted(function (Application $app) {
245219
Scramble::configure()

src/Support/ContainerUtils.php

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
<?php
2+
3+
namespace Dedoc\Scramble\Support;
4+
5+
use Dedoc\Scramble\Support\OperationExtensions\ParameterExtractor\ParameterExtractor;
6+
use ReflectionClass;
7+
use ReflectionNamedType;
8+
use ReflectionParameter;
9+
10+
class ContainerUtils
11+
{
12+
/**
13+
* @template T of object
14+
*
15+
* @param class-string<T> $class
16+
* @return T
17+
*/
18+
public static function makeContextable(string $class, array $contextfulBindings = [])
19+
{
20+
$reflectionClass = new ReflectionClass($class);
21+
22+
$parameters = $reflectionClass->getConstructor()?->getParameters() ?? [];
23+
24+
$contextfulArguments = collect($parameters)
25+
->mapWithKeys(function (ReflectionParameter $p) use ($contextfulBindings) {
26+
$parameterClass = $p->getType() instanceof ReflectionNamedType
27+
? $p->getType()->getName()
28+
: null;
29+
30+
return $parameterClass && isset($contextfulBindings[$parameterClass]) ? [
31+
$p->name => $contextfulBindings[$parameterClass],
32+
] : [];
33+
})
34+
->all();
35+
36+
return app()->make($class, $contextfulArguments);
37+
}
38+
}

0 commit comments

Comments
 (0)