Skip to content

Commit 3026dc7

Browse files
authored
Implement Stringable in Enum rule (#58392)
1 parent 35a52af commit 3026dc7

File tree

2 files changed

+45
-1
lines changed

2 files changed

+45
-1
lines changed

src/Illuminate/Validation/Rules/Enum.php

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,12 @@
77
use Illuminate\Contracts\Validation\ValidatorAwareRule;
88
use Illuminate\Support\Arr;
99
use Illuminate\Support\Traits\Conditionable;
10+
use Stringable;
1011
use TypeError;
1112

12-
class Enum implements Rule, ValidatorAwareRule
13+
use function Illuminate\Support\enum_value;
14+
15+
class Enum implements Rule, ValidatorAwareRule, Stringable
1316
{
1417
use Conditionable;
1518

@@ -144,4 +147,24 @@ public function setValidator($validator)
144147

145148
return $this;
146149
}
150+
151+
/**
152+
* Convert the rule to a validation string.
153+
*
154+
* @return string
155+
*/
156+
public function __toString()
157+
{
158+
$cases = ! empty($this->only)
159+
? $this->only
160+
: array_filter($this->type::cases(), fn ($case) => ! in_array($case, $this->except, true));
161+
162+
$values = array_map(function ($case) {
163+
$value = enum_value($case);
164+
165+
return '"'.str_replace('"', '""', (string) $value).'"';
166+
}, $cases);
167+
168+
return 'in:'.implode(',', $values);
169+
}
147170
}

tests/Validation/ValidationEnumRuleTest.php

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -303,6 +303,27 @@ public function testCustomMessageUsingDotNotationAndFqcnWorks()
303303
], $v->messages()->all());
304304
}
305305

306+
public function testEnumRuleIsStringable()
307+
{
308+
$rule = new Enum(StringStatus::class);
309+
310+
$this->assertSame('in:"pending","done"', (string) $rule);
311+
}
312+
313+
public function testEnumRuleStringableWithOnly()
314+
{
315+
$rule = (new Enum(StringStatus::class))->only([StringStatus::pending]);
316+
317+
$this->assertSame('in:"pending"', (string) $rule);
318+
}
319+
320+
public function testEnumRuleStringableWithExcept()
321+
{
322+
$rule = (new Enum(StringStatus::class))->except([StringStatus::pending]);
323+
324+
$this->assertSame('in:"done"', (string) $rule);
325+
}
326+
306327
protected function setUp(): void
307328
{
308329
$container = Container::getInstance();

0 commit comments

Comments
 (0)