Skip to content

Commit 283c693

Browse files
committed
Return errors for attribute and attribute.locale
1 parent d0f1ba6 commit 283c693

File tree

2 files changed

+50
-13
lines changed

2 files changed

+50
-13
lines changed

src/UniqueTranslationValidator.php

Lines changed: 30 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,18 +18,18 @@ class UniqueTranslationValidator
1818
*/
1919
public function validate($attribute, $value, $parameters, $validator) {
2020
$attributeParts = explode('.', $attribute);
21-
$attribute = $attributeParts[0];
21+
$name = $attributeParts[0];
2222
$locale = $attributeParts[1] ?? app()->getLocale();
2323
$table = $parameters[0] ?? null;
24-
$column = $this->filterNullValues($parameters[1] ?? null) ?: $attribute;
24+
$column = $this->filterNullValues($parameters[1] ?? null) ?: $name;
2525
$ignoreValue = $this->filterNullValues($parameters[2] ?? null);
2626
$ignoreColumn = $this->filterNullValues($parameters[3] ?? null);
2727

2828
$isUnique = $this->isUnique($value, $locale, $table, $column, $ignoreValue, $ignoreColumn);
2929

30-
$validator->setCustomMessages([
31-
'unique_translation' => trans('validation.unique'),
32-
]);
30+
if ( ! $isUnique) {
31+
$this->addErrorsToValidator($validator, $attribute, $parameters, $name, $locale);
32+
}
3333

3434
return $isUnique;
3535
}
@@ -110,4 +110,29 @@ protected function ignore($query, $column = null, $value = null)
110110

111111
return $query;
112112
}
113+
114+
/**
115+
* Add error messages to the validator.
116+
*
117+
* @param \Illuminate\Validation\Validator $validator
118+
* @param string $attribute
119+
* @param array $parameters
120+
* @param string $name
121+
* @param string $locale
122+
*
123+
* @return void
124+
*/
125+
protected function addErrorsToValidator($validator, $attribute, $parameters, $name, $locale)
126+
{
127+
$message = trans('validation.unique');
128+
$rule = 'unique_translation';
129+
130+
// This Validator method will format the placeholders:
131+
// eg. "post_slug" will become "post slug".
132+
$formattedMessage = $validator->makeReplacements($message, $attribute, $rule, $parameters);
133+
134+
$validator->errors()
135+
->add($name, $formattedMessage)
136+
->add("{$name}.{$locale}", $formattedMessage);
137+
}
113138
}

tests/UniqueTranslationTest.php

Lines changed: 20 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ public function it_checks_if_the_translation_for_the_current_locale_is_unique()
5252
$this->post('test', [
5353
'slug' => 'slug-en',
5454
'name' => 'name-en',
55-
])->assertSessionHasErrors(['slug', 'name']);
55+
])->assertSessionHasErrors(['slug', 'name', 'slug.en', 'name.en']);
5656

5757
$this->post('test', [
5858
'slug' => 'slug-nl',
@@ -73,12 +73,12 @@ public function it_checks_if_the_translation_for_a_specific_locale_is_unique()
7373
$this->post('test', [
7474
'slug' => ['en' => 'slug-en'],
7575
'name' => ['en' => 'name-en'],
76-
])->assertSessionHasErrors(['slug.en', 'name.en']);
76+
])->assertSessionHasErrors(['slug', 'name', 'slug.en', 'name.en']);
7777

7878
$this->post('test', [
7979
'slug' => ['nl' => 'slug-nl'],
8080
'name' => ['nl' => 'name-nl'],
81-
])->assertSessionHasErrors(['slug.nl', 'name.nl']);
81+
])->assertSessionHasErrors(['slug', 'name', 'slug.nl', 'name.nl']);
8282

8383
$this->post('test', [
8484
'slug' => ['en' => 'different-slug-en'],
@@ -104,7 +104,7 @@ public function the_models_attribute_name_can_be_specified()
104104
$this->post('test-single', [
105105
'form_slug' => 'slug-en',
106106
'form_name' => 'name-en',
107-
])->assertSessionHasErrors(['form_slug', 'form_name']);
107+
])->assertSessionHasErrors(['form_slug', 'form_name', 'form_slug.en', 'form_name.en']);
108108

109109
$rules = [
110110
'form_slug.*' => "{$this->rule}:{$this->table},slug",
@@ -116,7 +116,7 @@ public function the_models_attribute_name_can_be_specified()
116116
$this->post('test-array', [
117117
'form_slug' => ['nl' => 'slug-nl'],
118118
'form_name' => ['nl' => 'name-nl'],
119-
])->assertSessionHasErrors(['form_slug.nl', 'form_name.nl']);
119+
])->assertSessionHasErrors(['form_slug', 'form_name', 'form_slug.nl', 'form_name.nl']);
120120
}
121121

122122
/** @test */
@@ -176,7 +176,7 @@ public function it_ignores_a_specific_attribute_with_the_given_value()
176176
}
177177

178178
/** @test */
179-
public function it_returns_the_correct_error_message()
179+
public function it_returns_a_default_error_message()
180180
{
181181
$rules = [
182182
'form_slug' => "{$this->rule}:{$this->table},slug",
@@ -190,16 +190,28 @@ public function it_returns_the_correct_error_message()
190190
'form_name' => 'name-en',
191191
]);
192192

193+
$expectedSlugError = trans('validation.unique', ['attribute' => 'form slug']);
194+
$expectedNameError = trans('validation.unique', ['attribute' => 'form name']);
195+
193196
$errors = session('errors');
197+
194198
$returnedSlugError = $errors->first('form_slug');
195199
$returnedNameError = $errors->first('form_name');
196-
$expectedSlugError = trans('validation.unique', ['attribute' => 'form slug']);
197-
$expectedNameError = trans('validation.unique', ['attribute' => 'form name']);
198200

199201
$this->assertNotEmpty($returnedSlugError);
200202
$this->assertNotEmpty($returnedNameError);
203+
201204
$this->assertEquals($expectedSlugError, $returnedSlugError);
202205
$this->assertEquals($expectedNameError, $returnedNameError);
206+
207+
$returnedSlugArrayError = $errors->first('form_slug.en');
208+
$returnedNameArrayError = $errors->first('form_name.en');
209+
210+
$this->assertNotEmpty($returnedSlugArrayError);
211+
$this->assertNotEmpty($returnedNameArrayError);
212+
213+
$this->assertEquals($expectedSlugError, $returnedSlugArrayError);
214+
$this->assertEquals($expectedNameError, $returnedNameArrayError);
203215
}
204216

205217
/**

0 commit comments

Comments
 (0)