diff --git a/src/Illuminate/Validation/Concerns/ValidatesAttributes.php b/src/Illuminate/Validation/Concerns/ValidatesAttributes.php index 0be199d2990..d30d7b5d2ad 100644 --- a/src/Illuminate/Validation/Concerns/ValidatesAttributes.php +++ b/src/Illuminate/Validation/Concerns/ValidatesAttributes.php @@ -1444,6 +1444,25 @@ public function validateExcludeUnless($attribute, $value, $parameters) return in_array($other, $values); } + /** + * Indicate that an attribute should be excluded when another attribute is missing. + * + * @param string $attribute + * @param mixed $value + * @param mixed $parameters + * @return bool + */ + public function validateExcludeWithout($attribute, $value, $parameters) + { + $this->requireParameterCount(1, $parameters, 'exclude_without'); + + if ($this->anyFailingRequired($parameters)) { + return false; + } + + return true; + } + /** * Prepare the values and the other value for validation. * diff --git a/src/Illuminate/Validation/Validator.php b/src/Illuminate/Validation/Validator.php index ef5b4b60477..e5c8d94c7a6 100755 --- a/src/Illuminate/Validation/Validator.php +++ b/src/Illuminate/Validation/Validator.php @@ -166,8 +166,15 @@ class Validator implements ValidatorContract * @var array */ protected $fileRules = [ - 'File', 'Image', 'Mimes', 'Mimetypes', 'Min', - 'Max', 'Size', 'Between', 'Dimensions', + 'Between', + 'Dimensions', + 'File', + 'Image', + 'Max', + 'Mimes', + 'Mimetypes', + 'Min', + 'Size', ]; /** @@ -176,8 +183,16 @@ class Validator implements ValidatorContract * @var array */ protected $implicitRules = [ - 'Required', 'Filled', 'RequiredWith', 'RequiredWithAll', 'RequiredWithout', - 'RequiredWithoutAll', 'RequiredIf', 'RequiredUnless', 'Accepted', 'Present', + 'Accepted', + 'Filled', + 'Present', + 'Required', + 'RequiredIf', + 'RequiredUnless', + 'RequiredWith', + 'RequiredWithAll', + 'RequiredWithout', + 'RequiredWithoutAll', ]; /** @@ -186,10 +201,27 @@ class Validator implements ValidatorContract * @var array */ protected $dependentRules = [ - 'RequiredWith', 'RequiredWithAll', 'RequiredWithout', 'RequiredWithoutAll', - 'RequiredIf', 'RequiredUnless', 'Confirmed', 'Same', 'Different', 'Unique', - 'Before', 'After', 'BeforeOrEqual', 'AfterOrEqual', 'Gt', 'Lt', 'Gte', 'Lte', - 'ExcludeIf', 'ExcludeUnless', + 'After', + 'AfterOrEqual', + 'Before', + 'BeforeOrEqual', + 'Confirmed', + 'Different', + 'ExcludeIf', + 'ExcludeUnless', + 'ExcludeWithout', + 'Gt', + 'Gte', + 'Lt', + 'Lte', + 'RequiredIf', + 'RequiredUnless', + 'RequiredWith', + 'RequiredWithAll', + 'RequiredWithout', + 'RequiredWithoutAll', + 'Same', + 'Unique', ]; /** @@ -197,7 +229,7 @@ class Validator implements ValidatorContract * * @var array */ - protected $excludeRules = ['ExcludeIf', 'ExcludeUnless']; + protected $excludeRules = ['ExcludeIf', 'ExcludeUnless', 'ExcludeWithout']; /** * The size related validation rules. diff --git a/tests/Validation/ValidationValidatorTest.php b/tests/Validation/ValidationValidatorTest.php index 1e899a5ceef..f5426a3e74b 100755 --- a/tests/Validation/ValidationValidatorTest.php +++ b/tests/Validation/ValidationValidatorTest.php @@ -5204,6 +5204,21 @@ public function testExcludeUnless() $this->assertSame(['mouse' => ['validation.required']], $validator->messages()->toArray()); } + public function testExcludeWithout() + { + $validator = new Validator( + $this->getIlluminateArrayTranslator(), + ['region' => 'South'], + [ + 'country' => 'exclude_without:region|nullable|required_with:region|string|min:3', + 'region' => 'exclude_without:country|nullable|required_with:country|string|min:3', + ] + ); + + $this->assertTrue($validator->fails()); + $this->assertSame(['country' => ['validation.required_with']], $validator->messages()->toArray()); + } + public function testExcludeValuesAreReallyRemoved() { $validator = new Validator(