Skip to content

Commit 2e1ced1

Browse files
fixed parameters handling taking in into consideration
1 parent 2f4137d commit 2e1ced1

File tree

4 files changed

+28
-7
lines changed

4 files changed

+28
-7
lines changed

src/Support/OperationExtensions/ParameterExtractor/PathParametersExtractor.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,8 @@ public function handle(RouteInfo $routeInfo, array $parameterExtractionResults):
7474
$param->setExtensionProperty('optional', true);
7575
}
7676

77+
$param->setAttribute('nonBody', true);
78+
7779
return $param;
7880
}, array_values(array_diff($route->parameterNames(), $this->getParametersFromString($route->getDomain()))));
7981

src/Support/OperationExtensions/RequestBodyExtension.php

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ public function handle(Operation $operation, RouteInfo $routeInfo)
5151
->summary(Str::of($routeInfo->phpDoc()->getAttribute('summary'))->rtrim('.'))
5252
->description($description);
5353

54-
$allParams = $rulesResults->flatMap->parameters->unique('name')->values()->all();
54+
$allParams = $rulesResults->flatMap->parameters->unique(fn ($p) => "$p->name.$p->in")->values()->all();
5555

5656
$mediaType = $this->getMediaType($operation, $routeInfo, $allParams);
5757

@@ -81,15 +81,14 @@ public function handle(Operation $operation, RouteInfo $routeInfo)
8181
$schemalessResults = collect([$this->mergeSchemalessRulesResults($schemalessResults->values())]);
8282

8383
$schemas = $schemaResults->merge($schemalessResults)
84-
->filter(fn (ParametersExtractionResult $r) => count($r->parameters) || $r->schemaName)
8584
->map(function (ParametersExtractionResult $r) use ($nonBodyParams) {
86-
$qpNames = collect($nonBodyParams)->keyBy('name');
85+
$qpNames = collect($nonBodyParams)->keyBy(fn ($p) => "$p->name.$p->in");
8786

88-
$r->parameters = collect($r->parameters)->filter(fn ($p) => ! $qpNames->has($p->name))->values()->all();
87+
$r->parameters = collect($r->parameters)->filter(fn ($p) => ! $qpNames->has("$p->name.$p->in"))->values()->all();
8988

9089
return $r;
9190
})
92-
->values()
91+
->filter(fn (ParametersExtractionResult $r) => count($r->parameters) || $r->schemaName)
9392
->map($this->makeSchemaFromResults(...));
9493

9594
if ($schemas->isEmpty()) {
@@ -155,7 +154,7 @@ protected function makeComposedRequestBodySchema(Collection $schemas)
155154
protected function mergeSchemalessRulesResults(Collection $schemalessResults): ParametersExtractionResult
156155
{
157156
return new ParametersExtractionResult(
158-
parameters: $this->convertDotNamedParamsToComplexStructures($schemalessResults->values()->flatMap->parameters->unique('name')->values()->all()),
157+
parameters: $this->convertDotNamedParamsToComplexStructures($schemalessResults->values()->flatMap->parameters->unique(fn ($p) => "$p->name.$p->in")->values()->all()),
159158
);
160159
}
161160

src/Support/OperationExtensions/RulesExtractor/DeepParametersMerger.php

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,9 @@ public function __construct(private Collection $parameters) {}
1717

1818
public function handle()
1919
{
20-
return $this->handleNested($this->parameters->keyBy('name'))
20+
return $this->parameters->groupBy('in')
21+
->map(fn ($parameters) => $this->handleNested($parameters->keyBy('name'))->values())
22+
->flatten()
2123
->values()
2224
->all();
2325
}

tests/Attributes/ParameterAnnotationsTest.php

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
use Dedoc\Scramble\Attributes\HeaderParameter;
77
use Dedoc\Scramble\Attributes\Parameter;
88
use Dedoc\Scramble\Attributes\PathParameter;
9+
use Dedoc\Scramble\Attributes\QueryParameter;
910
use Illuminate\Http\Request;
1011
use Illuminate\Routing\Router;
1112

@@ -68,6 +69,23 @@ class ParameterSimpleExampleController_ParameterAnnotationsTest
6869
public function __invoke() {}
6970
}
7071

72+
it('allows annotating parameters with the same names', function () {
73+
$openApi = generateForRoute(fn (Router $r) => $r->get('api/test', SameNameParametersController_ParameterAnnotationsTest::class));
74+
75+
expect($parameters = $openApi['paths']['/test']['get']['parameters'])
76+
->toHaveCount(2)
77+
->and($parameters[0]['name'])->toBe('per_page')
78+
->and($parameters[1]['name'])->toBe('per_page')
79+
->and($parameters[0]['in'])->toBe('query')
80+
->and($parameters[1]['in'])->toBe('header');
81+
});
82+
class SameNameParametersController_ParameterAnnotationsTest
83+
{
84+
#[QueryParameter('per_page')]
85+
#[HeaderParameter('per_page')]
86+
public function __invoke() {}
87+
}
88+
7189
it('supports complex examples for Parameter annotations', function () {
7290
$openApi = generateForRoute(fn (Router $r) => $r->get('api/test', ParameterComplexExampleController_ParameterAnnotationsTest::class));
7391

0 commit comments

Comments
 (0)