Skip to content

Commit b618bf7

Browse files
committed
Handle custom error messages
1 parent 283c693 commit b618bf7

File tree

2 files changed

+185
-14
lines changed

2 files changed

+185
-14
lines changed

src/UniqueTranslationValidator.php

Lines changed: 53 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ public function validate($attribute, $value, $parameters, $validator) {
2828
$isUnique = $this->isUnique($value, $locale, $table, $column, $ignoreValue, $ignoreColumn);
2929

3030
if ( ! $isUnique) {
31-
$this->addErrorsToValidator($validator, $attribute, $parameters, $name, $locale);
31+
$this->addErrorsToValidator($validator, $parameters, $name, $locale);
3232
}
3333

3434
return $isUnique;
@@ -115,24 +115,67 @@ protected function ignore($query, $column = null, $value = null)
115115
* Add error messages to the validator.
116116
*
117117
* @param \Illuminate\Validation\Validator $validator
118-
* @param string $attribute
119118
* @param array $parameters
120119
* @param string $name
121120
* @param string $locale
122121
*
123122
* @return void
124123
*/
125-
protected function addErrorsToValidator($validator, $attribute, $parameters, $name, $locale)
124+
protected function addErrorsToValidator($validator, $parameters, $name, $locale)
126125
{
127-
$message = trans('validation.unique');
128126
$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);
127+
$message = $this->getFormattedMessage($validator, $rule, $parameters, $name, $locale);
133128

134129
$validator->errors()
135-
->add($name, $formattedMessage)
136-
->add("{$name}.{$locale}", $formattedMessage);
130+
->add($name, $message)
131+
->add("{$name}.{$locale}", $message);
132+
}
133+
134+
/**
135+
* Get the formatted error message.
136+
*
137+
* This will format the placeholders:
138+
* e.g. "post_slug" will become "post slug".
139+
*
140+
* @param \Illuminate\Validation\Validator $validator
141+
* @param string $rule
142+
* @param array $parameters
143+
* @param string $name
144+
* @param string $locale
145+
*
146+
* @return string
147+
*/
148+
protected function getFormattedMessage($validator, $rule, $parameters, $name, $locale)
149+
{
150+
$message = $this->getMessage($validator, $rule, $name, $locale);
151+
152+
return $validator->makeReplacements($message, $name, $rule, $parameters);
153+
}
154+
155+
/**
156+
* Get any custom message from the validator or return a default message.
157+
*
158+
* @param \Illuminate\Validation\Validator $validator
159+
* @param string $rule
160+
* @param string $name
161+
* @param string $locale
162+
*
163+
* @return string
164+
*/
165+
protected function getMessage($validator, $rule, $name, $locale)
166+
{
167+
$keys = [
168+
"{$name}.{$rule}",
169+
"{$name}.*.{$rule}",
170+
"{$name}.{$locale}.{$rule}",
171+
];
172+
173+
foreach ($keys as $key) {
174+
if (array_key_exists($key, $validator->customMessages)) {
175+
return $validator->customMessages[$key];
176+
}
177+
}
178+
179+
return trans('validation.unique');
137180
}
138181
}

tests/UniqueTranslationTest.php

Lines changed: 132 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -176,7 +176,7 @@ public function it_ignores_a_specific_attribute_with_the_given_value()
176176
}
177177

178178
/** @test */
179-
public function it_returns_a_default_error_message()
179+
public function it_returns_a_default_error_message_when_validating_a_single_translation()
180180
{
181181
$rules = [
182182
'form_slug' => "{$this->rule}:{$this->table},slug",
@@ -214,18 +214,146 @@ public function it_returns_a_default_error_message()
214214
$this->assertEquals($expectedNameError, $returnedNameArrayError);
215215
}
216216

217+
/** @test */
218+
public function it_returns_a_default_error_message_when_validating_an_array()
219+
{
220+
$rules = [
221+
'form_slug.*' => "{$this->rule}:{$this->table},slug",
222+
'form_name.*' => new UniqueTranslationRule($this->table, 'name'),
223+
];
224+
225+
$this->createRoute('test', $rules);
226+
227+
$this->post('test', [
228+
'form_slug' => ['en' => 'slug-en'],
229+
'form_name' => ['en' => 'name-en'],
230+
]);
231+
232+
$expectedSlugError = trans('validation.unique', ['attribute' => 'form slug']);
233+
$expectedNameError = trans('validation.unique', ['attribute' => 'form name']);
234+
235+
$errors = session('errors');
236+
237+
$returnedSlugError = $errors->first('form_slug');
238+
$returnedNameError = $errors->first('form_name');
239+
240+
$this->assertNotEmpty($returnedSlugError);
241+
$this->assertNotEmpty($returnedNameError);
242+
243+
$this->assertEquals($expectedSlugError, $returnedSlugError);
244+
$this->assertEquals($expectedNameError, $returnedNameError);
245+
246+
$returnedSlugArrayError = $errors->first('form_slug.en');
247+
$returnedNameArrayError = $errors->first('form_name.en');
248+
249+
$this->assertNotEmpty($returnedSlugArrayError);
250+
$this->assertNotEmpty($returnedNameArrayError);
251+
252+
$this->assertEquals($expectedSlugError, $returnedSlugArrayError);
253+
$this->assertEquals($expectedNameError, $returnedNameArrayError);
254+
}
255+
256+
/** @test */
257+
public function it_returns_a_custom_error_message_when_validating_a_single_translation()
258+
{
259+
$rules = [
260+
'form_slug' => "{$this->rule}:{$this->table},slug",
261+
'form_name' => new UniqueTranslationRule($this->table, 'name'),
262+
];
263+
264+
$messages = [
265+
"form_slug.{$this->rule}" => 'Custom slug message for :attribute.',
266+
"form_name.{$this->rule}" => 'Custom name message for :attribute.',
267+
];
268+
269+
$this->createRoute('test', $rules, $messages);
270+
271+
$this->post('test', [
272+
'form_slug' => 'slug-en',
273+
'form_name' => 'name-en',
274+
]);
275+
276+
$expectedSlugError = 'Custom slug message for form slug.';
277+
$expectedNameError = 'Custom name message for form name.';
278+
279+
$errors = session('errors');
280+
281+
$returnedSlugError = $errors->first('form_slug');
282+
$returnedNameError = $errors->first('form_name');
283+
284+
$this->assertNotEmpty($returnedSlugError);
285+
$this->assertNotEmpty($returnedNameError);
286+
287+
$this->assertEquals($expectedSlugError, $returnedSlugError);
288+
$this->assertEquals($expectedNameError, $returnedNameError);
289+
290+
$returnedSlugArrayError = $errors->first('form_slug.en');
291+
$returnedNameArrayError = $errors->first('form_name.en');
292+
293+
$this->assertNotEmpty($returnedSlugArrayError);
294+
$this->assertNotEmpty($returnedNameArrayError);
295+
296+
$this->assertEquals($expectedSlugError, $returnedSlugArrayError);
297+
$this->assertEquals($expectedNameError, $returnedNameArrayError);
298+
}
299+
300+
/** @test */
301+
public function it_returns_a_custom_error_message_when_validating_an_array()
302+
{
303+
$rules = [
304+
'form_slug.*' => "{$this->rule}:{$this->table},slug",
305+
'form_name.*' => new UniqueTranslationRule($this->table, 'name'),
306+
];
307+
308+
$messages = [
309+
"form_slug.*.{$this->rule}" => 'Custom slug message for :attribute.',
310+
"form_name.*.{$this->rule}" => 'Custom name message for :attribute.',
311+
];
312+
313+
$this->createRoute('test', $rules, $messages);
314+
315+
$this->post('test', [
316+
'form_slug' => ['en' => 'slug-en'],
317+
'form_name' => ['en' => 'name-en'],
318+
]);
319+
320+
$expectedSlugError = 'Custom slug message for form slug.';
321+
$expectedNameError = 'Custom name message for form name.';
322+
323+
$errors = session('errors');
324+
325+
$returnedSlugError = $errors->first('form_slug');
326+
$returnedNameError = $errors->first('form_name');
327+
328+
$this->assertNotEmpty($returnedSlugError);
329+
$this->assertNotEmpty($returnedNameError);
330+
331+
$this->assertEquals($expectedSlugError, $returnedSlugError);
332+
$this->assertEquals($expectedNameError, $returnedNameError);
333+
334+
$returnedSlugArrayError = $errors->first('form_slug.en');
335+
$returnedNameArrayError = $errors->first('form_name.en');
336+
337+
$this->assertNotEmpty($returnedSlugArrayError);
338+
$this->assertNotEmpty($returnedNameArrayError);
339+
340+
$this->assertEquals($expectedSlugError, $returnedSlugArrayError);
341+
$this->assertEquals($expectedNameError, $returnedNameArrayError);
342+
}
343+
217344
/**
218345
* Create a test route.
219346
*
220347
* @param string $url
221348
* @param array $rules
349+
* @param array $messages
222350
*
223351
* @return void
224352
*/
225-
protected function createRoute($url, $rules)
353+
protected function createRoute($url, $rules, $messages = [])
226354
{
227-
Route::post($url, function () use ($rules) {
228-
return request()->validate($rules);
355+
Route::post($url, function () use ($rules, $messages) {
356+
return request()->validate($rules, $messages);
229357
});
230358
}
231359
}

0 commit comments

Comments
 (0)