Skip to content

Commit 899d3ca

Browse files
authored
[9.x] Add ability to supply additional callbacks in Rule::when (#40730)
* Add ability to supply callbacks in conditional rules * Revert call_user_func * Spacing
1 parent 6052bb5 commit 899d3ca

File tree

3 files changed

+21
-7
lines changed

3 files changed

+21
-7
lines changed

src/Illuminate/Validation/ConditionalRules.php

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -58,20 +58,26 @@ public function passes(array $data = [])
5858
/**
5959
* Get the rules.
6060
*
61+
* @param array $data
6162
* @return array
6263
*/
63-
public function rules()
64+
public function rules(array $data = [])
6465
{
65-
return is_string($this->rules) ? explode('|', $this->rules) : $this->rules;
66+
return is_string($this->rules)
67+
? explode('|', $this->rules)
68+
: value($this->rules, new Fluent($data));
6669
}
6770

6871
/**
6972
* Get the default rules.
7073
*
74+
* @param array $data
7175
* @return array
7276
*/
73-
public function defaultRules()
77+
public function defaultRules(array $data = [])
7478
{
75-
return is_string($this->defaultRules) ? explode('|', $this->defaultRules) : $this->defaultRules;
79+
return is_string($this->defaultRules)
80+
? explode('|', $this->defaultRules)
81+
: value($this->defaultRules, new Fluent($data));
7682
}
7783
}

src/Illuminate/Validation/ValidationRuleParser.php

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

314314
if ($attributeRules instanceof ConditionalRules) {
315315
return [$attribute => $attributeRules->passes($data)
316-
? array_filter($attributeRules->rules())
317-
: array_filter($attributeRules->defaultRules()), ];
316+
? array_filter($attributeRules->rules($data))
317+
: array_filter($attributeRules->defaultRules($data)), ];
318318
}
319319

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

325-
return $rule->passes($data) ? $rule->rules() : $rule->defaultRules();
325+
return $rule->passes($data) ? $rule->rules($data) : $rule->defaultRules($data);
326326
})->filter()->flatten(1)->values()->all()];
327327
})->all();
328328
}

tests/Validation/ValidationRuleParserTest.php

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,12 @@ public function testConditionalRulesAreProperlyExpandedAndFiltered()
2020
'city' => ['required', Rule::when(function (Fluent $input) {
2121
return true;
2222
}, ['min:2'])],
23+
'state' => ['required', Rule::when(true, function (Fluent $input) {
24+
return 'min:2';
25+
})],
26+
'zip' => ['required', Rule::when(false, [], function (Fluent $input) {
27+
return ['min:2'];
28+
})],
2329
]);
2430

2531
$this->assertEquals([
@@ -29,6 +35,8 @@ public function testConditionalRulesAreProperlyExpandedAndFiltered()
2935
'username' => ['required', 'min:2'],
3036
'address' => ['required'],
3137
'city' => ['required', 'min:2'],
38+
'state' => ['required', 'min:2'],
39+
'zip' => ['required', 'min:2'],
3240
], $rules);
3341
}
3442

0 commit comments

Comments
 (0)