From f5d3eeca3df61fd42abf041fbe69ac86a93c1e72 Mon Sep 17 00:00:00 2001 From: Peter Fox Date: Wed, 16 Jul 2025 13:34:50 +0100 Subject: [PATCH] Allows for strict boolean validation --- .../Concerns/ValidatesAttributes.php | 7 +- tests/Validation/ValidationValidatorTest.php | 76 +++++++++++++++++++ 2 files changed, 82 insertions(+), 1 deletion(-) diff --git a/src/Illuminate/Validation/Concerns/ValidatesAttributes.php b/src/Illuminate/Validation/Concerns/ValidatesAttributes.php index dd567b1afe65..e44ddf5a75f4 100644 --- a/src/Illuminate/Validation/Concerns/ValidatesAttributes.php +++ b/src/Illuminate/Validation/Concerns/ValidatesAttributes.php @@ -482,12 +482,17 @@ public function validateBetween($attribute, $value, $parameters) * * @param string $attribute * @param mixed $value + * @param array{0: 'strict'} $parameters * @return bool */ - public function validateBoolean($attribute, $value) + public function validateBoolean($attribute, $value, $parameters) { $acceptable = [true, false, 0, 1, '0', '1']; + if (($parameters[0] ?? null) === 'strict') { + $acceptable = [true, false]; + } + return in_array($value, $acceptable, true); } diff --git a/tests/Validation/ValidationValidatorTest.php b/tests/Validation/ValidationValidatorTest.php index 167711851fab..214b1aa3b459 100755 --- a/tests/Validation/ValidationValidatorTest.php +++ b/tests/Validation/ValidationValidatorTest.php @@ -3117,6 +3117,44 @@ public function testValidateBoolean() $this->assertTrue($v->passes()); } + public function testValidateBooleanStrict() + { + $trans = $this->getIlluminateArrayTranslator(); + + $v = new Validator($trans, ['foo' => false], ['foo' => 'Boolean:strict']); + $this->assertTrue($v->passes()); + + $v = new Validator($trans, ['foo' => true], ['foo' => 'Boolean:strict']); + $this->assertTrue($v->passes()); + + $v = new Validator($trans, ['foo' => 'no'], ['foo' => 'Boolean:strict']); + $this->assertFalse($v->passes()); + + $v = new Validator($trans, ['foo' => 'yes'], ['foo' => 'Boolean:strict']); + $this->assertFalse($v->passes()); + + $v = new Validator($trans, ['foo' => 'false'], ['foo' => 'Boolean:strict']); + $this->assertFalse($v->passes()); + + $v = new Validator($trans, ['foo' => 'true'], ['foo' => 'Boolean:strict']); + $this->assertFalse($v->passes()); + + $v = new Validator($trans, [], ['foo' => 'Boolean:strict']); + $this->assertTrue($v->passes()); + + $v = new Validator($trans, ['foo' => '1'], ['foo' => 'Boolean:strict']); + $this->assertFalse($v->passes()); + + $v = new Validator($trans, ['foo' => 1], ['foo' => 'Boolean:strict']); + $this->assertFalse($v->passes()); + + $v = new Validator($trans, ['foo' => '0'], ['foo' => 'Boolean:strict']); + $this->assertFalse($v->passes()); + + $v = new Validator($trans, ['foo' => 0], ['foo' => 'Boolean:strict']); + $this->assertFalse($v->passes()); + } + public function testValidateBool() { $trans = $this->getIlluminateArrayTranslator(); @@ -3154,6 +3192,44 @@ public function testValidateBool() $this->assertTrue($v->passes()); } + public function testValidateBoolStrict() + { + $trans = $this->getIlluminateArrayTranslator(); + + $v = new Validator($trans, ['foo' => false], ['foo' => 'Bool:strict']); + $this->assertTrue($v->passes()); + + $v = new Validator($trans, ['foo' => true], ['foo' => 'Bool:strict']); + $this->assertTrue($v->passes()); + + $v = new Validator($trans, ['foo' => 'no'], ['foo' => 'Bool:strict']); + $this->assertFalse($v->passes()); + + $v = new Validator($trans, ['foo' => 'yes'], ['foo' => 'Bool']); + $this->assertFalse($v->passes()); + + $v = new Validator($trans, ['foo' => 'false'], ['foo' => 'Bool:strict']); + $this->assertFalse($v->passes()); + + $v = new Validator($trans, ['foo' => 'true'], ['foo' => 'Bool:strict']); + $this->assertFalse($v->passes()); + + $v = new Validator($trans, [], ['foo' => 'Bool:strict']); + $this->assertTrue($v->passes()); + + $v = new Validator($trans, ['foo' => '1'], ['foo' => 'Bool:strict']); + $this->assertFalse($v->passes()); + + $v = new Validator($trans, ['foo' => 1], ['foo' => 'Bool:strict']); + $this->assertFalse($v->passes()); + + $v = new Validator($trans, ['foo' => '0'], ['foo' => 'Bool:strict']); + $this->assertFalse($v->passes()); + + $v = new Validator($trans, ['foo' => 0], ['foo' => 'Bool:strict']); + $this->assertFalse($v->passes()); + } + public function testValidateNumeric() { $trans = $this->getIlluminateArrayTranslator();