Skip to content

Commit 2e05abe

Browse files
wouterjnicolas-grekas
authored andcommitted
[Routing] Remove variadic constructor signature
1 parent 5e84142 commit 2e05abe

File tree

2 files changed

+38
-23
lines changed

2 files changed

+38
-23
lines changed

Requirement/EnumRequirement.php

+24-18
Original file line numberDiff line numberDiff line change
@@ -15,36 +15,42 @@
1515

1616
final class EnumRequirement implements \Stringable
1717
{
18-
/**
19-
* @var string[]
20-
*/
21-
private readonly array $values;
18+
private string $requirement;
2219

2320
/**
2421
* @template T of \BackedEnum
25-
* @param class-string<T> $enum
26-
* @param T ...$cases
22+
*
23+
* @param class-string<T>|list<T> $cases
2724
*/
28-
public function __construct(string $enum, \BackedEnum ...$cases)
25+
public function __construct(string|array $cases = [])
2926
{
30-
if (!\is_subclass_of($enum, \BackedEnum::class, true)) {
31-
throw new InvalidArgumentException(sprintf('"%s" is not a \BackedEnum class.', $enum));
32-
}
27+
if (\is_string($cases)) {
28+
if (!is_subclass_of($cases, \BackedEnum::class, true)) {
29+
throw new InvalidArgumentException(sprintf('"%s" is not a "BackedEnum" class.', $cases));
30+
}
31+
32+
$cases = $cases::cases();
33+
} else {
34+
$class = null;
35+
36+
foreach ($cases as $case) {
37+
if (!$case instanceof \BackedEnum) {
38+
throw new InvalidArgumentException(sprintf('Case must be a "BackedEnum" instance, "%s" given.', get_debug_type($case)));
39+
}
40+
41+
$class ??= \get_class($case);
3342

34-
foreach ($cases as $case) {
35-
if (!$case instanceof $enum) {
36-
throw new InvalidArgumentException(sprintf('"%s::%s" is not a case of "%s".', \get_class($case), $case->name, $enum));
43+
if (!$case instanceof $class) {
44+
throw new InvalidArgumentException(sprintf('"%s::%s" is not a case of "%s".', get_debug_type($case), $case->name, $class));
45+
}
3746
}
3847
}
3948

40-
$this->values = array_map(
41-
static fn (\BackedEnum $e): string => $e->value,
42-
$cases ?: $enum::cases(),
43-
);
49+
$this->requirement = implode('|', array_map(static fn ($e) => preg_quote($e->value), $cases));
4450
}
4551

4652
public function __toString(): string
4753
{
48-
return implode('|', array_map(preg_quote(...), $this->values));
54+
return $this->requirement;
4955
}
5056
}

Tests/Requirement/EnumRequirementTest.php

+14-5
Original file line numberDiff line numberDiff line change
@@ -25,33 +25,42 @@ class EnumRequirementTest extends TestCase
2525
public function testNotABackedEnum()
2626
{
2727
$this->expectException(InvalidArgumentException::class);
28-
$this->expectExceptionMessage('"Symfony\Component\Routing\Tests\Fixtures\Enum\TestUnitEnum" is not a \BackedEnum class.');
28+
$this->expectExceptionMessage('"Symfony\Component\Routing\Tests\Fixtures\Enum\TestUnitEnum" is not a "BackedEnum" class.');
2929

3030
new EnumRequirement(TestUnitEnum::class);
3131
}
3232

33+
public function testCaseNotABackedEnum()
34+
{
35+
$this->expectException(InvalidArgumentException::class);
36+
$this->expectExceptionMessage('Case must be a "BackedEnum" instance, "string" given.');
37+
38+
new EnumRequirement(['wrong']);
39+
}
40+
3341
public function testCaseFromAnotherEnum()
3442
{
3543
$this->expectException(InvalidArgumentException::class);
3644
$this->expectExceptionMessage('"Symfony\Component\Routing\Tests\Fixtures\Enum\TestStringBackedEnum2::Spades" is not a case of "Symfony\Component\Routing\Tests\Fixtures\Enum\TestStringBackedEnum".');
3745

38-
new EnumRequirement(TestStringBackedEnum::class, TestStringBackedEnum::Diamonds, TestStringBackedEnum2::Spades);
46+
new EnumRequirement([TestStringBackedEnum::Diamonds, TestStringBackedEnum2::Spades]);
3947
}
4048

4149
/**
4250
* @dataProvider provideToString
4351
*/
44-
public function testToString(string $expected, string $enum, \BackedEnum ...$cases)
52+
public function testToString(string $expected, string|array $cases = [])
4553
{
46-
$this->assertSame($expected, (string) new EnumRequirement($enum, ...$cases));
54+
$this->assertSame($expected, (string) new EnumRequirement($cases));
4755
}
4856

4957
public function provideToString()
5058
{
5159
return [
5260
['hearts|diamonds|clubs|spades', TestStringBackedEnum::class],
5361
['10|20|30|40', TestIntBackedEnum::class],
54-
['diamonds|spades', TestStringBackedEnum::class, TestStringBackedEnum::Diamonds, TestStringBackedEnum::Spades],
62+
['diamonds|spades', [TestStringBackedEnum::Diamonds, TestStringBackedEnum::Spades]],
63+
['diamonds', [TestStringBackedEnum::Diamonds]],
5564
['hearts|diamonds|clubs|spa\|des', TestStringBackedEnum2::class],
5665
];
5766
}

0 commit comments

Comments
 (0)