Skip to content

Commit a8e8b49

Browse files
committed
Merge branch '8.x' of github.com:laravel/framework into 8.x
2 parents 5e4ded8 + 1a2ecc9 commit a8e8b49

File tree

4 files changed

+46
-5
lines changed

4 files changed

+46
-5
lines changed

src/Illuminate/Validation/ConditionalRules.php

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,17 +20,26 @@ class ConditionalRules
2020
*/
2121
protected $rules;
2222

23+
/**
24+
* The rules to be added to the attribute if the condition fails.
25+
*
26+
* @var array|string
27+
*/
28+
protected $defaultRules;
29+
2330
/**
2431
* Create a new conditional rules instance.
2532
*
2633
* @param callable|bool $condition
2734
* @param array|string $rules
35+
* @param array|string $defaultRules
2836
* @return void
2937
*/
30-
public function __construct($condition, $rules)
38+
public function __construct($condition, $rules, $defaultRules = [])
3139
{
3240
$this->condition = $condition;
3341
$this->rules = $rules;
42+
$this->defaultRules = $defaultRules;
3443
}
3544

3645
/**
@@ -55,4 +64,14 @@ public function rules()
5564
{
5665
return is_string($this->rules) ? explode('|', $this->rules) : $this->rules;
5766
}
67+
68+
/**
69+
* Get the default rules.
70+
*
71+
* @return array
72+
*/
73+
public function defaultRules()
74+
{
75+
return is_string($this->defaultRules) ? explode('|', $this->defaultRules) : $this->defaultRules;
76+
}
5877
}

src/Illuminate/Validation/Rule.php

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,12 @@ class Rule
2020
*
2121
* @param callable|bool $condition
2222
* @param array|string $rules
23+
* @param array|string $defaultRules
2324
* @return \Illuminate\Validation\ConditionalRules
2425
*/
25-
public static function when($condition, $rules)
26+
public static function when($condition, $rules, $defaultRules = [])
2627
{
27-
return new ConditionalRules($condition, $rules);
28+
return new ConditionalRules($condition, $rules, $defaultRules);
2829
}
2930

3031
/**

src/Illuminate/Validation/ValidationRuleParser.php

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -291,15 +291,17 @@ public static function filterConditionalRules($rules, array $data = [])
291291
}
292292

293293
if ($attributeRules instanceof ConditionalRules) {
294-
return [$attribute => $attributeRules->passes($data) ? $attributeRules->rules() : null];
294+
return [$attribute => $attributeRules->passes($data)
295+
? $attributeRules->rules()
296+
: $attributeRules->defaultRules(), ];
295297
}
296298

297299
return [$attribute => collect($attributeRules)->map(function ($rule) use ($data) {
298300
if (! $rule instanceof ConditionalRules) {
299301
return [$rule];
300302
}
301303

302-
return $rule->passes($data) ? $rule->rules() : null;
304+
return $rule->passes($data) ? $rule->rules() : $rule->defaultRules();
303305
})->filter()->flatten(1)->values()->all()];
304306
})->filter()->all();
305307
}

tests/Validation/ValidationRuleParserTest.php

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,4 +30,23 @@ public function test_conditional_rules_are_properly_expanded_and_filtered()
3030
'city' => ['required', 'min:2'],
3131
], $rules);
3232
}
33+
34+
public function test_conditional_rules_with_default()
35+
{
36+
$rules = ValidationRuleParser::filterConditionalRules([
37+
'name' => Rule::when(true, ['required', 'min:2'], ['string', 'max:10']),
38+
'email' => Rule::when(false, ['required', 'min:2'], ['string', 'max:10']),
39+
'password' => Rule::when(false, 'required|min:2', 'string|max:10'),
40+
'username' => ['required', Rule::when(true, ['min:2'], ['string', 'max:10'])],
41+
'address' => ['required', Rule::when(false, ['min:2'], ['string', 'max:10'])],
42+
]);
43+
44+
$this->assertEquals([
45+
'name' => ['required', 'min:2'],
46+
'email' => ['string', 'max:10'],
47+
'password' => ['string', 'max:10'],
48+
'username' => ['required', 'min:2'],
49+
'address' => ['required', 'string', 'max:10'],
50+
], $rules);
51+
}
3352
}

0 commit comments

Comments
 (0)