From b29d7d538d1d4e137ebb76b591a704a323123783 Mon Sep 17 00:00:00 2001 From: Dave Shoreman Date: Tue, 4 May 2021 01:10:32 +0100 Subject: [PATCH] Fix fields not required with required_unless This fixes an issue where the `required_unless` rule does not add a "required" error when the 'other' field isn't included in input data. Take `'field' => 'required_unless:other,true'` as an example. With `[]`, the absense of `other` implies its value is *not `true`* and therefore `field` should be required. Instead, validation automatically passes. Flipping `return true` fixed the failing test but failed with valid data that *wasn't* tested. The extra two tests ensure it still passes if the field is required *and provided*, or absent when 'other' *expects* null. --- .../Validation/Concerns/ValidatesAttributes.php | 4 ---- tests/Validation/ValidationValidatorTest.php | 16 ++++++++++++++-- 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/src/Illuminate/Validation/Concerns/ValidatesAttributes.php b/src/Illuminate/Validation/Concerns/ValidatesAttributes.php index a8e2a73b2407..85a7592d99d4 100644 --- a/src/Illuminate/Validation/Concerns/ValidatesAttributes.php +++ b/src/Illuminate/Validation/Concerns/ValidatesAttributes.php @@ -1547,10 +1547,6 @@ public function validateRequiredUnless($attribute, $value, $parameters) { $this->requireParameterCount(2, $parameters, 'required_unless'); - if (! Arr::has($this->data, $parameters[0])) { - return true; - } - [$values, $other] = $this->parseDependentRuleParameters($parameters); if (! in_array($other, $values, is_bool($other) || is_null($other))) { diff --git a/tests/Validation/ValidationValidatorTest.php b/tests/Validation/ValidationValidatorTest.php index 6c13c7ce0186..0d3bab85d4cc 100755 --- a/tests/Validation/ValidationValidatorTest.php +++ b/tests/Validation/ValidationValidatorTest.php @@ -1198,13 +1198,25 @@ public function testRequiredUnless() $this->assertTrue($v->passes()); $trans = $this->getIlluminateArrayTranslator(); - $v = new Validator($trans, ['foo' => false], ['bar' => 'required_unless:foo,false']); - $this->assertTrue($v->passes()); + $v = new Validator($trans, [], ['bar' => 'required_unless:foo,true']); + $this->assertTrue($v->fails()); $trans = $this->getIlluminateArrayTranslator(); $v = new Validator($trans, ['foo' => false], ['bar' => 'required_unless:foo,true']); $this->assertTrue($v->fails()); + $trans = $this->getIlluminateArrayTranslator(); + $v = new Validator($trans, ['bar' => '1'], ['bar' => 'required_unless:foo,true']); + $this->assertTrue($v->passes()); + + $trans = $this->getIlluminateArrayTranslator(); + $v = new Validator($trans, ['foo' => false], ['bar' => 'required_unless:foo,false']); + $this->assertTrue($v->passes()); + + $trans = $this->getIlluminateArrayTranslator(); + $v = new Validator($trans, [], ['foo' => 'required_unless:bar,null']); + $this->assertTrue($v->passes()); + $trans = $this->getIlluminateArrayTranslator(); $v = new Validator($trans, ['foo' => true], ['bar' => 'required_unless:foo,null']); $this->assertTrue($v->fails());