Skip to content

Commit

Permalink
[8.x] Add default rules in conditional rules (laravel#38450)
Browse files Browse the repository at this point in the history
* Add default rules in conditional rules

* formatting

Co-authored-by: Taylor Otwell <taylorotwell@gmail.com>
  • Loading branch information
2 people authored and Krisell committed Aug 20, 2021
1 parent 4847ac0 commit 6a6cfb5
Show file tree
Hide file tree
Showing 4 changed files with 46 additions and 5 deletions.
21 changes: 20 additions & 1 deletion src/Illuminate/Validation/ConditionalRules.php
Original file line number Diff line number Diff line change
Expand Up @@ -20,17 +20,26 @@ class ConditionalRules
*/
protected $rules;

/**
* The rules to be added to the attribute if the condition fails.
*
* @var array|string
*/
protected $defaultRules;

/**
* Create a new conditional rules instance.
*
* @param callable|bool $condition
* @param array|string $rules
* @param array|string $defaultRules
* @return void
*/
public function __construct($condition, $rules)
public function __construct($condition, $rules, $defaultRules = [])
{
$this->condition = $condition;
$this->rules = $rules;
$this->defaultRules = $defaultRules;
}

/**
Expand All @@ -55,4 +64,14 @@ public function rules()
{
return is_string($this->rules) ? explode('|', $this->rules) : $this->rules;
}

/**
* Get the default rules.
*
* @return array
*/
public function defaultRules()
{
return is_string($this->defaultRules) ? explode('|', $this->defaultRules) : $this->defaultRules;
}
}
5 changes: 3 additions & 2 deletions src/Illuminate/Validation/Rule.php
Original file line number Diff line number Diff line change
Expand Up @@ -20,11 +20,12 @@ class Rule
*
* @param callable|bool $condition
* @param array|string $rules
* @param array|string $defaultRules
* @return \Illuminate\Validation\ConditionalRules
*/
public static function when($condition, $rules)
public static function when($condition, $rules, $defaultRules = [])
{
return new ConditionalRules($condition, $rules);
return new ConditionalRules($condition, $rules, $defaultRules);
}

/**
Expand Down
6 changes: 4 additions & 2 deletions src/Illuminate/Validation/ValidationRuleParser.php
Original file line number Diff line number Diff line change
Expand Up @@ -291,15 +291,17 @@ public static function filterConditionalRules($rules, array $data = [])
}

if ($attributeRules instanceof ConditionalRules) {
return [$attribute => $attributeRules->passes($data) ? $attributeRules->rules() : null];
return [$attribute => $attributeRules->passes($data)
? $attributeRules->rules()
: $attributeRules->defaultRules()];
}

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

return $rule->passes($data) ? $rule->rules() : null;
return $rule->passes($data) ? $rule->rules() : $rule->defaultRules();
})->filter()->flatten(1)->values()->all()];
})->filter()->all();
}
Expand Down
19 changes: 19 additions & 0 deletions tests/Validation/ValidationRuleParserTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -30,4 +30,23 @@ public function test_conditional_rules_are_properly_expanded_and_filtered()
'city' => ['required', 'min:2'],
], $rules);
}

public function test_conditional_rules_with_default()
{
$rules = ValidationRuleParser::filterConditionalRules([
'name' => Rule::when(true, ['required', 'min:2'], ['string', 'max:10']),
'email' => Rule::when(false, ['required', 'min:2'], ['string', 'max:10']),
'password' => Rule::when(false, 'required|min:2', 'string|max:10'),
'username' => ['required', Rule::when(true, ['min:2'], ['string', 'max:10'])],
'address' => ['required', Rule::when(false, ['min:2'], ['string', 'max:10'])],
]);

$this->assertEquals([
'name' => ['required', 'min:2'],
'email' => ['string', 'max:10'],
'password' => ['string', 'max:10'],
'username' => ['required', 'min:2'],
'address' => ['required', 'string', 'max:10'],
], $rules);
}
}

0 comments on commit 6a6cfb5

Please sign in to comment.