diff --git a/src/Illuminate/Validation/ValidationRuleParser.php b/src/Illuminate/Validation/ValidationRuleParser.php index 252af3c720ba..ce499a55a58c 100644 --- a/src/Illuminate/Validation/ValidationRuleParser.php +++ b/src/Illuminate/Validation/ValidationRuleParser.php @@ -292,8 +292,8 @@ public static function filterConditionalRules($rules, array $data = []) if ($attributeRules instanceof ConditionalRules) { return [$attribute => $attributeRules->passes($data) - ? $attributeRules->rules() - : $attributeRules->defaultRules(), ]; + ? array_filter($attributeRules->rules()) + : array_filter($attributeRules->defaultRules()), ]; } return [$attribute => collect($attributeRules)->map(function ($rule) use ($data) { @@ -303,6 +303,6 @@ public static function filterConditionalRules($rules, array $data = []) return $rule->passes($data) ? $rule->rules() : $rule->defaultRules(); })->filter()->flatten(1)->values()->all()]; - })->filter()->all(); + })->all(); } } diff --git a/tests/Validation/ValidationRuleParserTest.php b/tests/Validation/ValidationRuleParserTest.php index 0adccc4fa53a..01dc86f12692 100644 --- a/tests/Validation/ValidationRuleParserTest.php +++ b/tests/Validation/ValidationRuleParserTest.php @@ -24,6 +24,7 @@ public function test_conditional_rules_are_properly_expanded_and_filtered() $this->assertEquals([ 'name' => ['required', 'min:2'], + 'email' => [], 'password' => ['required', 'min:2'], 'username' => ['required', 'min:2'], 'address' => ['required'], @@ -31,6 +32,21 @@ public function test_conditional_rules_are_properly_expanded_and_filtered() ], $rules); } + public function test_empty_rules_are_preserved() + { + $rules = ValidationRuleParser::filterConditionalRules([ + 'name' => [], + 'email' => '', + 'password' => Rule::when(true, 'required|min:2'), + ]); + + $this->assertEquals([ + 'name' => [], + 'email' => '', + 'password' => ['required', 'min:2'], + ], $rules); + } + public function test_conditional_rules_with_default() { $rules = ValidationRuleParser::filterConditionalRules([ @@ -49,4 +65,19 @@ public function test_conditional_rules_with_default() 'address' => ['required', 'string', 'max:10'], ], $rules); } + + public function test_empty_conditional_rules_are_preserved() + { + $rules = ValidationRuleParser::filterConditionalRules([ + 'name' => Rule::when(true, '', ['string', 'max:10']), + 'email' => Rule::when(false, ['required', 'min:2'], []), + 'password' => Rule::when(false, 'required|min:2', 'string|max:10'), + ]); + + $this->assertEquals([ + 'name' => [], + 'email' => [], + 'password' => ['string', 'max:10'], + ], $rules); + } }