Skip to content

Commit 78289b4

Browse files
authored
[9.x] Allow validator messages to use nested arrays (#43981)
* Allow validator messages to be nested arrays of attribute => [ rule => message ] * Handle nested message arrays for wildcards * Add missing return statement for wildcard validation messages * Add test for nested arrays of validation messages
1 parent 150bd1b commit 78289b4

File tree

2 files changed

+45
-3
lines changed

2 files changed

+45
-3
lines changed

src/Illuminate/Validation/Concerns/FormatsMessages.php

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ protected function getFromLocalArray($attribute, $lowerRule, $source = null)
9999
{
100100
$source = $source ?: $this->customMessages;
101101

102-
$keys = ["{$attribute}.{$lowerRule}", $lowerRule];
102+
$keys = ["{$attribute}.{$lowerRule}", $lowerRule, $attribute];
103103

104104
// First we will check for a custom message for an attribute specific rule
105105
// message for the fields, then we will check for a general custom line
@@ -110,14 +110,26 @@ protected function getFromLocalArray($attribute, $lowerRule, $source = null)
110110
$pattern = str_replace('\*', '([^.]*)', preg_quote($sourceKey, '#'));
111111

112112
if (preg_match('#^'.$pattern.'\z#u', $key) === 1) {
113-
return $source[$sourceKey];
113+
$message = $source[$sourceKey];
114+
115+
if (is_array($message) && isset($message[$lowerRule])) {
116+
return $message[$lowerRule];
117+
}
118+
119+
return $message;
114120
}
115121

116122
continue;
117123
}
118124

119125
if (Str::is($sourceKey, $key)) {
120-
return $source[$sourceKey];
126+
$message = $source[$sourceKey];
127+
128+
if ($sourceKey === $attribute && is_array($message) && isset($message[$lowerRule])) {
129+
return $message[$lowerRule];
130+
}
131+
132+
return $message;
121133
}
122134
}
123135
}

tests/Validation/ValidationValidatorTest.php

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,36 @@ public function testNestedErrorMessagesAreRetrievedFromLocalArray()
7070
$this->assertSame('post name is required', $v->errors()->all()[0]);
7171
}
7272

73+
public function testNestedArrayErrorMessagesAreRetrievedFromLocalArray()
74+
{
75+
$trans = $this->getIlluminateArrayTranslator();
76+
$v = new Validator($trans, [
77+
'users' => [
78+
[
79+
'name' => 'Taylor Otwell',
80+
'posts' => [
81+
[
82+
'name' => '',
83+
],
84+
],
85+
],
86+
],
87+
], [
88+
'users.*.name' => ['required'],
89+
'users.*.posts.*.name' => ['required'],
90+
], [
91+
'users.*.name' => [
92+
'required' => 'user name is required',
93+
],
94+
'users.*.posts.*.name' => [
95+
'required' => 'post name is required',
96+
],
97+
]);
98+
99+
$this->assertFalse($v->passes());
100+
$this->assertSame('post name is required', $v->errors()->all()[0]);
101+
}
102+
73103
public function testSometimesWorksOnNestedArrays()
74104
{
75105
$trans = $this->getIlluminateArrayTranslator();

0 commit comments

Comments
 (0)