Skip to content

Commit 1dd5027

Browse files
[11.x] Allow passing Enum casts to Rule::enum()->only() and ->except() (#52073)
* Add tests * Allow passing `Arrayable`s to Enum rule `only` and `except` * Remove duplicate line
1 parent 3343f2b commit 1dd5027

File tree

2 files changed

+12
-6
lines changed

2 files changed

+12
-6
lines changed

src/Illuminate/Validation/Rules/Enum.php

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
namespace Illuminate\Validation\Rules;
44

5+
use Illuminate\Contracts\Support\Arrayable;
56
use Illuminate\Contracts\Validation\Rule;
67
use Illuminate\Contracts\Validation\ValidatorAwareRule;
78
use Illuminate\Support\Arr;
@@ -80,25 +81,25 @@ public function passes($attribute, $value)
8081
/**
8182
* Specify the cases that should be considered valid.
8283
*
83-
* @param \UnitEnum[]|\UnitEnum $values
84+
* @param \UnitEnum[]|\UnitEnum|\Illuminate\Contracts\Support\Arrayable<array-key, \UnitEnum> $values
8485
* @return $this
8586
*/
8687
public function only($values)
8788
{
88-
$this->only = Arr::wrap($values);
89+
$this->only = $values instanceof Arrayable ? $values->toArray() : Arr::wrap($values);
8990

9091
return $this;
9192
}
9293

9394
/**
9495
* Specify the cases that should be considered invalid.
9596
*
96-
* @param \UnitEnum[]|\UnitEnum $values
97+
* @param \UnitEnum[]|\UnitEnum|\Illuminate\Contracts\Support\Arrayable<array-key, \UnitEnum> $values
9798
* @return $this
9899
*/
99100
public function except($values)
100101
{
101-
$this->except = Arr::wrap($values);
102+
$this->except = $values instanceof Arrayable ? $values->toArray() : Arr::wrap($values);
102103

103104
return $this;
104105
}

tests/Validation/ValidationEnumRuleTest.php

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,9 @@
33
namespace Illuminate\Tests\Validation;
44

55
use Illuminate\Container\Container;
6+
use Illuminate\Contracts\Support\Arrayable;
7+
use Illuminate\Database\Eloquent\Casts\ArrayObject;
8+
use Illuminate\Support\Collection;
69
use Illuminate\Support\Facades\Facade;
710
use Illuminate\Translation\ArrayLoader;
811
use Illuminate\Translation\Translator;
@@ -101,7 +104,7 @@ public function testValidationPassesForAllCasesUntilEitherOnlyOrExceptIsPassed()
101104
#[DataProvider('conditionalCasesDataProvider')]
102105
public function testValidationPassesWhenOnlyCasesProvided(
103106
IntegerStatus|int $enum,
104-
array|IntegerStatus $only,
107+
array|Arrayable|IntegerStatus $only,
105108
bool $expected
106109
) {
107110
$v = new Validator(
@@ -120,7 +123,7 @@ public function testValidationPassesWhenOnlyCasesProvided(
120123
#[DataProvider('conditionalCasesDataProvider')]
121124
public function testValidationPassesWhenExceptCasesProvided(
122125
int|IntegerStatus $enum,
123-
array|IntegerStatus $except,
126+
array|Arrayable|IntegerStatus $except,
124127
bool $expected
125128
) {
126129
$v = new Validator(
@@ -251,6 +254,8 @@ public static function conditionalCasesDataProvider(): array
251254
return [
252255
[IntegerStatus::done, IntegerStatus::done, true],
253256
[IntegerStatus::done, [IntegerStatus::done, IntegerStatus::pending], true],
257+
[IntegerStatus::done, new ArrayObject([IntegerStatus::done, IntegerStatus::pending]), true],
258+
[IntegerStatus::done, new Collection([IntegerStatus::done, IntegerStatus::pending]), true],
254259
[IntegerStatus::pending->value, [IntegerStatus::done, IntegerStatus::pending], true],
255260
[IntegerStatus::done->value, IntegerStatus::pending, false],
256261
];

0 commit comments

Comments
 (0)