Skip to content

Commit 393ccc6

Browse files
authored
[11.x] Add RequiredIfDeclined validation rule (#51030)
1 parent dec31b0 commit 393ccc6

File tree

4 files changed

+53
-0
lines changed

4 files changed

+53
-0
lines changed

src/Illuminate/Validation/Concerns/ReplacesAttributes.php

+16
Original file line numberDiff line numberDiff line change
@@ -609,6 +609,22 @@ protected function replaceRequiredIfAccepted($message, $attribute, $rule, $param
609609
return str_replace([':other'], $parameters, $message);
610610
}
611611

612+
/**
613+
* Replace all place-holders for the required_if_declined rule.
614+
*
615+
* @param string $message
616+
* @param string $attribute
617+
* @param string $rule
618+
* @param array<int,string> $parameters
619+
* @return string
620+
*/
621+
public function replaceRequiredIfDeclined($message, $attribute, $rule, $parameters)
622+
{
623+
$parameters[0] = $this->getDisplayableAttribute($parameters[0]);
624+
625+
return str_replace([':other'], $parameters, $message);
626+
}
627+
612628
/**
613629
* Replace all place-holders for the required_unless rule.
614630
*

src/Illuminate/Validation/Concerns/ValidatesAttributes.php

+19
Original file line numberDiff line numberDiff line change
@@ -1961,6 +1961,25 @@ public function validateRequiredIfAccepted($attribute, $value, $parameters)
19611961
return true;
19621962
}
19631963

1964+
/**
1965+
* Validate that an attribute exists when another attribute was "declined".
1966+
*
1967+
* @param string $attribute
1968+
* @param mixed $value
1969+
* @param mixed $parameters
1970+
* @return bool
1971+
*/
1972+
public function validateRequiredIfDeclined($attribute, $value, $parameters)
1973+
{
1974+
$this->requireParameterCount(1, $parameters, 'required_if_declined');
1975+
1976+
if ($this->validateDeclined($parameters[0], $this->getValue($parameters[0]))) {
1977+
return $this->validateRequired($attribute, $value);
1978+
}
1979+
1980+
return true;
1981+
}
1982+
19641983
/**
19651984
* Validate that an attribute does not exist or is an empty string.
19661985
*

src/Illuminate/Validation/Validator.php

+2
Original file line numberDiff line numberDiff line change
@@ -221,6 +221,7 @@ class Validator implements ValidatorContract
221221
'Required',
222222
'RequiredIf',
223223
'RequiredIfAccepted',
224+
'RequiredIfDeclined',
224225
'RequiredUnless',
225226
'RequiredWith',
226227
'RequiredWithAll',
@@ -252,6 +253,7 @@ class Validator implements ValidatorContract
252253
'DeclinedIf',
253254
'RequiredIf',
254255
'RequiredIfAccepted',
256+
'RequiredIfDeclined',
255257
'RequiredUnless',
256258
'RequiredWith',
257259
'RequiredWithAll',

tests/Validation/ValidationValidatorTest.php

+16
Original file line numberDiff line numberDiff line change
@@ -2447,6 +2447,22 @@ public function testValidateAcceptedIf()
24472447
$this->assertSame('The foo field must be accepted when bar is true.', $v->messages()->first('foo'));
24482448
}
24492449

2450+
public function testValidateRequiredIfDeclined()
2451+
{
2452+
$trans = $this->getIlluminateArrayTranslator();
2453+
$v = new Validator($trans, ['foo' => 'yes', 'bar' => 'baz'], ['bar' => 'required_if_declined:foo']);
2454+
$this->assertTrue($v->passes());
2455+
2456+
$v = new Validator($trans, ['foo' => 'no', 'bar' => 'baz'], ['bar' => 'required_if_declined:foo']);
2457+
$this->assertTrue($v->passes());
2458+
2459+
$v = new Validator($trans, ['foo' => 'yes', 'bar' => ''], ['bar' => 'required_if_declined:foo']);
2460+
$this->assertTrue($v->passes());
2461+
2462+
$v = new Validator($trans, ['foo' => 'no', 'bar' => ''], ['bar' => 'required_if_declined:foo']);
2463+
$this->assertFalse($v->passes());
2464+
}
2465+
24502466
public function testValidateDeclined()
24512467
{
24522468
$trans = $this->getIlluminateArrayTranslator();

0 commit comments

Comments
 (0)