Изменение сообщений об ошибках
При необходимости вы можете задать свои сообщения об ошибках проверки ввода вместо изначальных. Для этого есть несколько способов. Во-первых, вы можете передать свои сообщения третьим аргументом метода Validator::make():
$messages = [
'required' => 'Необходимо указать :attribute.',
];
$validator = Validator::make($input, $rules, $messages);
В этом примере обозначение :attribute будет заменено именем проверяемого поля. Вы можете использовать и другие обозначения. Например:
$messages = [
'same' => ':attribute и :other должны совпадать.',
'size' => ':attribute должен быть равен :size.',
'between' => ':attribute должен быть между :min и :max.',
'in' => ':attribute должен иметь один из следующих типов: :values',
];
Указание своего сообщения для конкретного атрибута
Иногда вам может понадобиться указать своё сообщения только для конкретного поля. Вы можете сделать это с помощью «точечной» записи. Сначала укажите имя атрибута, а затем правило:
$messages = [
'email.required' => 'Нам надо знать ваш e-mail!',
];
Указание своих сообщений в языковых файлах
В большинстве случаев вы будете указывать свои сообщения в языковом файле, а не передавать их напрямую в Validator. Для этого добавьте свои сообщения в массив custom в языковом файле resources/lang/xx/validation.php:
PHP
'custom' => [
'email' => [
'required' => 'Нам надо знать ваш e-mail!',
],
],
Ссылка на доку https://laravel.com/docs/7.x/validation#introduction
In Laravel, majority of validation error messages are good enough:
However, if you change the label, the validation message does not match the label:
Let’s see how we can fix this.
Label and Field Name Mismatch — Translated Form Attributes
As the application grows, you’ll have cases where the field name and label do not match. For example, I have a field called Order Date
on the UI but the form has an ordered_at
name:
Blade form
<div class="mt-4">
<x-input-label for="ordered_at" :value="__('Order date')"/>
<x-text-input id="ordered_at" class="block mt-1 w-full" type="date" name="ordered_at"
:value="old('ordered_at')"/>
<x-input-error :messages="$errors->get('ordered_at')" class="mt-2"/>
</div>
This will result in the following validation message:
The ordered at field is required.
It is not that user-friendly as our name is Order date
. Let’s fix this by adding the attributes
method to our Form Request class:
Form Request Class
use Illuminate\Foundation\Http\FormRequest;
class StoreOrderRequest extends FormRequest
{
public function rules(): array
{
return [
'ordered_at' => ['required', 'date'],
// ...
];
}
// ...
public function attributes(): array
{
return [
'ordered_at' => 'order date',
];
}
}
With this, we’ve told that once we have a field named ordered_at
— its visual representation should be order date
. This will result in the following validation message:
The order date field is required.
To go even further, we can use a translation here:
Form Request Class
// ...
public function attributes(): array
{
return [
'ordered_at' => __('Order date'),
];
}
This will result in: The Order date field is required.
— matching the label.
Validating Array of Fields
This one is tricky. You might see something like…
This lesson is only for Premium Members.
Want to access all lessons of this course?
You also get:
-
49 courses (910 lessons, 46 h 42 min total)
-
Premium tutorials
-
Access to repositories
-
Private Discord
Let’s say that you are writing a Laravel package that involves data validation with custom error messages. Let’s also say that you are interested in allowing your package to be translated into other languages. How would you pass your custom error strings to your validator?
I ran into this issue when working on my Laravel/Sentry 2 bridge package Sentinel. (It is not related to Cartalyst’s Sentinel Package.) This package uses a Validation system inspired by the book Implementing Laravel by Chris Fidao, and in several locations makes use of custom error messages.
When I switched to using language strings instead of strait text I wasn’t quite sure how to pull the custom error messages from the language files and pass them to the Validator. Here is what I landed on:
First we need to make sure that the Package’s namespace is passed to the Translator. Add this line to the Service Provider’s boot function:
1 | // Package Service Provider |
2 | class SentinelServiceProvider extends ServiceProvider |
3 | { |
4 | |
5 | // … |
6 | |
7 | public function boot() |
8 | { |
9 | // … |
10 | |
11 | // Add the Translator Namespace |
12 | $this->app[‘translator’]->addNamespace(‘Sentinel’, __DIR__.’/../lang’); |
13 | } |
14 | |
15 | } |
The addNamespace
function informs Laravel’s translator class of the location of our language files and allows for the use of the ‘Sentinel’ namespace when translating language strings. We can now reference the Sentinel Package language strings via the Illuminate\Translation\Translator
class:
1 | echo Lang::get(‘Sentinel::users.noaccess’) |
2 | |
3 | // Result: |
4 | // You are not allowed to do that. |
We can also use trans()
, which is a helper function that aliases Lang::get()
.
1 | echo trans(‘Sentinel::users.noaccess’) |
2 | |
3 | // Result: |
4 | // You are not allowed to do that. |
Now we need to feed our custom error message strings to the Validator. This may be different for you, depending on how you handle validation, but the basic idea should remain the same.
1 | |
2 | <?php |
3 | |
4 | namespace Sentinel\Service\Validation; |
5 | |
6 | use Illuminate\Validation\Factory; |
7 | |
8 | abstract class AbstractLaravelValidator implements ValidableInterface |
9 | { |
10 | |
11 | /** |
12 | * Validator |
13 | * |
14 | * @var \Illuminate\Validation\Factory |
15 | */ |
16 | protected $validator; |
17 | |
18 | /** |
19 | * Custom Validation Messages |
20 | * |
21 | * @var Array |
22 | */ |
23 | protected $messages = array(); |
24 | |
25 | public function __construct(Factory $validator) |
26 | { |
27 | $this->validator = $validator; |
28 | |
29 | // Retrieve Custom Validation Messages & Pass them to the validator. |
30 | $this->messages = array_dot(trans(‘Sentinel::validation.custom’)); |
31 | } |
32 | |
33 | // … |
34 | } |
src/Sentinel/Service/Validation/AbstractLaravelValidator.php
Here we are establishing a $messages
class member and loading our custom language strings when the abstract validator class is instantiated. The language files use Sentinel::validaton.custom
to refer to the array of custom error message strings.
Now all that remains is to pass the messages to the validator when we are attempting to validate data:
1 | abstract class AbstractLaravelValidator implements ValidableInterface |
2 | { |
3 | |
4 | // … |
5 | |
6 | /** |
7 | * Validation passes or fails |
8 | * |
9 | * @return boolean |
10 | */ |
11 | public function passes() |
12 | { |
13 | $validator = $this->validator->make($this->data, $this->rules, $this->messages); |
14 | |
15 | if ($validator->fails() ) |
16 | { |
17 | $this->errors = $validator->messages(); |
18 | return false; |
19 | } |
20 | |
21 | return true; |
22 | } |
23 | } |
src/Sentinel/Service/Validation/AbstractLaravelValidator.php
The validator takes three arguments:
- An array of data to be validated.
- An array of the validation rules for that data.
- Optional: An array of custom error messages.
The messages array uses the input and names as array keys, and the corresponding value is the desired message text.
Problem solved!
Search code, repositories, users, issues, pull requests…
Provide feedback
Saved searches
Use saved searches to filter your results more quickly
Sign up
В прошлых статьях был рассмотрен механизм валидации принимаемых данных. Рекомендуем посмотреть эти статьи:
- Проверка принимаемых данных в Laravel
- Проверка принимаемых данных в Laravel (часть 2)
В этой статье будет подробнее описан способ изменения сообщений, которые выдаются в процессе обработки ошибок.
Изменение сообщений об ошибках
Существует несколько способов для задания своих текстов сообщений об ошибках валидации. Первый — можно передать текст сообщения третьим аргументом для метода «make» класса «Validator»:
<?php
$messages = [
'required' => 'Необходимо заполнить поле :attribute.',
];
$validator = Validator::make($input, $rules, $messages);
?>
Обратите внимание на «:attribute» в тексте сообщения. Оно будет заменено на имя передаваемого поля. Приведём другие примеры автоматической подстановки таких значений:
<?php
$messages = [
'same' => ':attribute и :other должны совпадать.',
'size' => ':attribute должен быть равен :size.',
'between' => ':attribute должен быть между :min и :max.',
'in' => ':attribute должен иметь один из следующих типов: :values',
];
?>
Если нужно установить текст ошибки только для конкретного поля, а не для всех подобных ошибок во всех полях, то необходимо записать его через точку «имя_атрибута.правило»:
<?php
$messages = [
'email.required' => 'Нам надо знать ваш e-mail!',
];
?>
Сообщения на разных языках
Ситуация с передачей текста сообщения напрямую в «validator» встречается довольно редко. Обычно сообщения записываются в языковом файле resources/lang/xx/validation.php
. Там они записываются
<?php
'custom' => [
'email' => [
'required' => 'Пожалуйста, введите свой e-mail',
],
],
?>
Кроме того в этом файле файле можно указывать свои шаблоны для замены (как с «:attribute»):
<?php
'attributes' => [
'email' => 'адрес электронной почты',
],
?>
Была ли эта статья полезна?
Есть вопрос?
Закажите недорогой хостинг
Заказать
всего от 290 руб