diff --git a/src/Metadata/Parameters.php b/src/Metadata/Parameters.php index 2f20937cb64..0bb13dabf70 100644 --- a/src/Metadata/Parameters.php +++ b/src/Metadata/Parameters.php @@ -37,9 +37,13 @@ public function __construct(array $parameters = []) $parameterName = $parameter->getKey(); } - $this->parameters[] = [$parameterName, $parameter]; + $key = \sprintf('%s.%s', $parameter::class, $parameterName); + + $this->parameters[$key] = [$parameterName, $parameter]; } + $this->parameters = array_values($this->parameters); + $this->sort(); } diff --git a/src/Metadata/Tests/ParametersTest.php b/src/Metadata/Tests/ParametersTest.php index 6b7b5583390..edc26ff817a 100644 --- a/src/Metadata/Tests/ParametersTest.php +++ b/src/Metadata/Tests/ParametersTest.php @@ -13,6 +13,7 @@ namespace ApiPlatform\Metadata\Tests; +use ApiPlatform\Metadata\HeaderParameter; use ApiPlatform\Metadata\Parameters; use ApiPlatform\Metadata\QueryParameter; use PHPUnit\Framework\TestCase; @@ -25,4 +26,27 @@ public function testDefaultValue(): void $parameters = new Parameters(['a' => $r]); $this->assertSame($r, $parameters->get('a')); } + + public function testDuplicated(): void + { + $r1 = new QueryParameter(key: 'a'); + $r2 = new QueryParameter(key: 'b'); + $r3 = new HeaderParameter(key: 'a'); + $r4 = new HeaderParameter(key: 'b'); + $parameters = new Parameters([$r1, $r2, $r3, $r4]); + $this->assertCount(4, $parameters); + $this->assertSame($r1, $parameters->get('a')); + $this->assertSame($r2, $parameters->get('b')); + $this->assertSame($r3, $parameters->get('a', HeaderParameter::class)); + $this->assertSame($r4, $parameters->get('b', HeaderParameter::class)); + + $r1 = new QueryParameter(key: 'a'); + $r2 = new QueryParameter(key: 'a'); + $r3 = new HeaderParameter(key: 'a'); + $r4 = new HeaderParameter(key: 'a'); + $parameters = new Parameters([$r1, $r2, $r3, $r4]); + $this->assertCount(2, $parameters); + $this->assertSame($r2, $parameters->get('a')); + $this->assertSame($r4, $parameters->get('a', HeaderParameter::class)); + } }