Skip to content

Commit 1b2107e

Browse files
[8.x] Fix bug discarding input fields with empty validation rules (#38563)
* Add failing tests * Fix `ValidationRuleParser` to ignore and preserve empty rules
1 parent 7cb5d25 commit 1b2107e

File tree

2 files changed

+34
-3
lines changed

2 files changed

+34
-3
lines changed

src/Illuminate/Validation/ValidationRuleParser.php

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -292,8 +292,8 @@ public static function filterConditionalRules($rules, array $data = [])
292292

293293
if ($attributeRules instanceof ConditionalRules) {
294294
return [$attribute => $attributeRules->passes($data)
295-
? $attributeRules->rules()
296-
: $attributeRules->defaultRules(), ];
295+
? array_filter($attributeRules->rules())
296+
: array_filter($attributeRules->defaultRules()), ];
297297
}
298298

299299
return [$attribute => collect($attributeRules)->map(function ($rule) use ($data) {
@@ -303,6 +303,6 @@ public static function filterConditionalRules($rules, array $data = [])
303303

304304
return $rule->passes($data) ? $rule->rules() : $rule->defaultRules();
305305
})->filter()->flatten(1)->values()->all()];
306-
})->filter()->all();
306+
})->all();
307307
}
308308
}

tests/Validation/ValidationRuleParserTest.php

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,13 +24,29 @@ public function test_conditional_rules_are_properly_expanded_and_filtered()
2424

2525
$this->assertEquals([
2626
'name' => ['required', 'min:2'],
27+
'email' => [],
2728
'password' => ['required', 'min:2'],
2829
'username' => ['required', 'min:2'],
2930
'address' => ['required'],
3031
'city' => ['required', 'min:2'],
3132
], $rules);
3233
}
3334

35+
public function test_empty_rules_are_preserved()
36+
{
37+
$rules = ValidationRuleParser::filterConditionalRules([
38+
'name' => [],
39+
'email' => '',
40+
'password' => Rule::when(true, 'required|min:2'),
41+
]);
42+
43+
$this->assertEquals([
44+
'name' => [],
45+
'email' => '',
46+
'password' => ['required', 'min:2'],
47+
], $rules);
48+
}
49+
3450
public function test_conditional_rules_with_default()
3551
{
3652
$rules = ValidationRuleParser::filterConditionalRules([
@@ -49,4 +65,19 @@ public function test_conditional_rules_with_default()
4965
'address' => ['required', 'string', 'max:10'],
5066
], $rules);
5167
}
68+
69+
public function test_empty_conditional_rules_are_preserved()
70+
{
71+
$rules = ValidationRuleParser::filterConditionalRules([
72+
'name' => Rule::when(true, '', ['string', 'max:10']),
73+
'email' => Rule::when(false, ['required', 'min:2'], []),
74+
'password' => Rule::when(false, 'required|min:2', 'string|max:10'),
75+
]);
76+
77+
$this->assertEquals([
78+
'name' => [],
79+
'email' => [],
80+
'password' => ['string', 'max:10'],
81+
], $rules);
82+
}
5283
}

0 commit comments

Comments
 (0)