Skip to content

Commit 1f5e383

Browse files
[11.x] Fix: Handles non nested explode of multiple Date and Numeric rules in ValidationRuleParser (#54718)
* fix: added condition to exit if Rule is Date or Numeric * test: added tests for new condition
1 parent be4c18d commit 1f5e383

File tree

2 files changed

+122
-0
lines changed

2 files changed

+122
-0
lines changed

src/Illuminate/Validation/ValidationRuleParser.php

+4
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,10 @@ protected function explodeExplicitRule($rule, $attribute)
9494
}
9595

9696
if (is_object($rule)) {
97+
if ($rule instanceof Date || $rule instanceof Numeric) {
98+
return explode('|', (string) $rule);
99+
}
100+
97101
return Arr::wrap($this->prepareRule($rule, $attribute));
98102
}
99103

tests/Validation/ValidationRuleParserTest.php

+118
Original file line numberDiff line numberDiff line change
@@ -351,4 +351,122 @@ public function testExplodeHandlesSegmentingNestedRules()
351351
],
352352
], $results->implicitAttributes);
353353
}
354+
355+
public function testExplodeHandlesStringDateRule()
356+
{
357+
$parser = (new ValidationRuleParser([
358+
'date' => '2021-01-01',
359+
]));
360+
361+
$rules = [
362+
'date' => 'date|date_format:Y-m-d',
363+
];
364+
365+
$results = $parser->explode($rules);
366+
367+
$this->assertEquals([
368+
'date' => [
369+
'date',
370+
'date_format:Y-m-d',
371+
],
372+
], $results->rules);
373+
}
374+
375+
public function testExplodeHandlesDateRule()
376+
{
377+
$parser = (new ValidationRuleParser([
378+
'date' => '2021-01-01',
379+
]));
380+
381+
$rules = [
382+
'date' => Rule::date(),
383+
];
384+
385+
$results = $parser->explode($rules);
386+
387+
$this->assertEquals([
388+
'date' => [
389+
'date',
390+
],
391+
], $results->rules);
392+
}
393+
394+
public function testExplodeHandlesDateRuleWithAdditionalRules()
395+
{
396+
$parser = (new ValidationRuleParser([
397+
'date' => '2021-01-01',
398+
]));
399+
400+
$rules = [
401+
'date' => Rule::date()->format('Y-m-d'),
402+
];
403+
404+
$results = $parser->explode($rules);
405+
406+
$this->assertEquals([
407+
'date' => [
408+
'date',
409+
'date_format:Y-m-d',
410+
],
411+
], $results->rules);
412+
}
413+
414+
public function testExplodeHandlesNumericStringRule()
415+
{
416+
$parser = (new ValidationRuleParser([
417+
'number' => 42,
418+
]));
419+
420+
$rules = [
421+
'number' => 'numeric|max:100',
422+
];
423+
424+
$results = $parser->explode($rules);
425+
426+
$this->assertEquals([
427+
'number' => [
428+
'numeric',
429+
'max:100',
430+
],
431+
], $results->rules);
432+
}
433+
434+
public function testExplodeHandlesNumericRule()
435+
{
436+
$parser = (new ValidationRuleParser([
437+
'number' => 42,
438+
]));
439+
440+
$rules = [
441+
'number' => Rule::numeric(),
442+
];
443+
444+
$results = $parser->explode($rules);
445+
446+
$this->assertEquals([
447+
'number' => [
448+
'numeric',
449+
],
450+
], $results->rules);
451+
}
452+
453+
public function testExplodeHandlesNumericRuleWithAdditionalRules()
454+
{
455+
$parser = (new ValidationRuleParser([
456+
'number' => 42,
457+
]));
458+
459+
$rules = [
460+
'number' => Rule::numeric()->max(100),
461+
];
462+
463+
$results = $parser->explode($rules);
464+
465+
$this->assertEquals([
466+
'number' => [
467+
'numeric',
468+
'max:100',
469+
],
470+
], $results->rules);
471+
}
354472
}

0 commit comments

Comments
 (0)