Skip to content

Commit de6c755

Browse files
authored
[11.x] Add Request::enums method to retrieve an array of enums (#53540)
* Add "enums" method to retrieve an array of enums * Add tests * Spacing
1 parent cff895d commit de6c755

File tree

2 files changed

+70
-3
lines changed

2 files changed

+70
-3
lines changed

src/Illuminate/Http/Concerns/InteractsWithInput.php

Lines changed: 32 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -403,15 +403,44 @@ public function date($key, $format = null, $tz = null)
403403
*/
404404
public function enum($key, $enumClass)
405405
{
406-
if ($this->isNotFilled($key) ||
407-
! enum_exists($enumClass) ||
408-
! method_exists($enumClass, 'tryFrom')) {
406+
if ($this->isNotFilled($key) || ! $this->isBackedEnum($enumClass)) {
409407
return null;
410408
}
411409

412410
return $enumClass::tryFrom($this->input($key));
413411
}
414412

413+
/**
414+
* Retrieve input from the request as an array of enums.
415+
*
416+
* @template TEnum
417+
*
418+
* @param string $key
419+
* @param class-string<TEnum> $enumClass
420+
* @return TEnum[]
421+
*/
422+
public function enums($key, $enumClass)
423+
{
424+
if ($this->isNotFilled($key) || ! $this->isBackedEnum($enumClass)) {
425+
return [];
426+
}
427+
428+
return $this->collect($key)->map(function ($value) use ($enumClass) {
429+
return $enumClass::tryFrom($value);
430+
})->filter()->all();
431+
}
432+
433+
/**
434+
* Determine if the given enum class is backed.
435+
*
436+
* @param class-string $enumClass
437+
* @return bool
438+
*/
439+
protected function isBackedEnum($enumClass)
440+
{
441+
return enum_exists($enumClass) && method_exists($enumClass, 'tryFrom');
442+
}
443+
415444
/**
416445
* Retrieve input from the request as a collection.
417446
*

tests/Http/HttpRequestTest.php

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -795,6 +795,44 @@ public function testEnumMethod()
795795
$this->assertNull($request->enum('int.doesnt_exist', TestIntegerEnumBacked::class));
796796
}
797797

798+
public function testEnumsMethod()
799+
{
800+
$request = Request::create('/', 'GET', [
801+
'valid_enum_values' => ['test', 'test'],
802+
'invalid_enum_values' => ['invalid', 'invalid'],
803+
'empty_value_request' => [],
804+
'string' => [
805+
'minus_1' => ['-1', '0'],
806+
'0' => '0',
807+
'plus_1' => '1',
808+
'doesnt_exist' => '-1024',
809+
],
810+
'int' => [
811+
'minus_1' => -1,
812+
'0' => 0,
813+
'plus_1' => 1,
814+
'doesnt_exist' => 1024,
815+
],
816+
]);
817+
818+
$this->assertEmpty($request->enums('doesnt_exist', TestEnumBacked::class));
819+
820+
$this->assertEquals([TestEnumBacked::test, TestEnumBacked::test], $request->enums('valid_enum_values', TestEnumBacked::class));
821+
822+
$this->assertEmpty($request->enums('invalid_enum_value', TestEnumBacked::class));
823+
$this->assertEmpty($request->enums('empty_value_request', TestEnumBacked::class));
824+
$this->assertEmpty($request->enums('valid_enum_value', TestEnum::class));
825+
826+
$this->assertEquals([TestIntegerEnumBacked::minus_1, TestIntegerEnumBacked::zero], $request->enums('string.minus_1', TestIntegerEnumBacked::class));
827+
$this->assertEquals([TestIntegerEnumBacked::zero], $request->enums('string.0', TestIntegerEnumBacked::class));
828+
$this->assertEquals([TestIntegerEnumBacked::plus_1], $request->enums('string.plus_1', TestIntegerEnumBacked::class));
829+
$this->assertEmpty($request->enums('string.doesnt_exist', TestIntegerEnumBacked::class));
830+
$this->assertEquals([TestIntegerEnumBacked::minus_1], $request->enums('int.minus_1', TestIntegerEnumBacked::class));
831+
$this->assertEquals([TestIntegerEnumBacked::zero], $request->enums('int.0', TestIntegerEnumBacked::class));
832+
$this->assertEquals([TestIntegerEnumBacked::plus_1], $request->enums('int.plus_1', TestIntegerEnumBacked::class));
833+
$this->assertEmpty($request->enums('int.doesnt_exist', TestIntegerEnumBacked::class));
834+
}
835+
798836
public function testArrayAccess()
799837
{
800838
$request = Request::create('/', 'GET', ['name' => null, 'foo' => ['bar' => null, 'baz' => '']]);

0 commit comments

Comments
 (0)