Skip to content

Commit 9b2f986

Browse files
authored
fix(metadata): eliminate duplicate keys in the constructor of Parameters (#7492)
1 parent b59626a commit 9b2f986

File tree

2 files changed

+29
-1
lines changed

2 files changed

+29
-1
lines changed

src/Metadata/Parameters.php

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,9 +37,13 @@ public function __construct(array $parameters = [])
3737
$parameterName = $parameter->getKey();
3838
}
3939

40-
$this->parameters[] = [$parameterName, $parameter];
40+
$key = \sprintf('%s.%s', $parameter::class, $parameterName);
41+
42+
$this->parameters[$key] = [$parameterName, $parameter];
4143
}
4244

45+
$this->parameters = array_values($this->parameters);
46+
4347
$this->sort();
4448
}
4549

src/Metadata/Tests/ParametersTest.php

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313

1414
namespace ApiPlatform\Metadata\Tests;
1515

16+
use ApiPlatform\Metadata\HeaderParameter;
1617
use ApiPlatform\Metadata\Parameters;
1718
use ApiPlatform\Metadata\QueryParameter;
1819
use PHPUnit\Framework\TestCase;
@@ -25,4 +26,27 @@ public function testDefaultValue(): void
2526
$parameters = new Parameters(['a' => $r]);
2627
$this->assertSame($r, $parameters->get('a'));
2728
}
29+
30+
public function testDuplicated(): void
31+
{
32+
$r1 = new QueryParameter(key: 'a');
33+
$r2 = new QueryParameter(key: 'b');
34+
$r3 = new HeaderParameter(key: 'a');
35+
$r4 = new HeaderParameter(key: 'b');
36+
$parameters = new Parameters([$r1, $r2, $r3, $r4]);
37+
$this->assertCount(4, $parameters);
38+
$this->assertSame($r1, $parameters->get('a'));
39+
$this->assertSame($r2, $parameters->get('b'));
40+
$this->assertSame($r3, $parameters->get('a', HeaderParameter::class));
41+
$this->assertSame($r4, $parameters->get('b', HeaderParameter::class));
42+
43+
$r1 = new QueryParameter(key: 'a');
44+
$r2 = new QueryParameter(key: 'a');
45+
$r3 = new HeaderParameter(key: 'a');
46+
$r4 = new HeaderParameter(key: 'a');
47+
$parameters = new Parameters([$r1, $r2, $r3, $r4]);
48+
$this->assertCount(2, $parameters);
49+
$this->assertSame($r2, $parameters->get('a'));
50+
$this->assertSame($r4, $parameters->get('a', HeaderParameter::class));
51+
}
2852
}

0 commit comments

Comments
 (0)