From 0cbdbe224645873e05fba1897552796276d9ee14 Mon Sep 17 00:00:00 2001 From: Jacob Baker-Kretzmar Date: Thu, 26 Aug 2021 15:46:54 -0400 Subject: [PATCH 1/2] Add failing tests --- tests/Validation/ValidationRuleParserTest.php | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) 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); + } } From 9f05145e7b39b14401c91f42ae17defa122dfbec Mon Sep 17 00:00:00 2001 From: Jacob Baker-Kretzmar Date: Thu, 26 Aug 2021 15:47:22 -0400 Subject: [PATCH 2/2] Fix `ValidationRuleParser` to ignore and preserve empty rules --- src/Illuminate/Validation/ValidationRuleParser.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) 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(); } }