Как настроить валидатор сообщений с помощью Laravel

#laravel #validation

Вопрос:

Я создаю API, который позволяет пользователям вводить некоторую информацию, такую как электронная почта, номер телефона, адрес … Но если пользователи вводят неправильные номера телефонов, ошибка проверки

 {
  "message": "The given data was invalid.",
  "errors": {
    "phone": [
      "The phone has already been taken."
    ]
  }
}
 

Как вы можете видеть, возвращаемое сообщение является

 "message": "The given data was invalid."
 

. Но сообщение, которого я ожидаю, таково The phone has already been taken . Как я могу настроить сообщение так, как я ожидаю? С валидатором электронной почты сообщение то же самое, но ключ есть email . Сообщение, которое я ожидаю, это

 "message": "The ... has already been taken. "
 

Я использую laravel 8 и проверяю в запросе
Пример функции rules()

     public function rules()
    {
        return [
            'profile_img' => 'nullable|image|mimes:jpeg,png,jpg,gif,svg|max:' . config('filesystems.max_upload_size'),
            'name' => 'nullable|min:3',
            'phone' => [
                'required',
                'numeric',
                new UpdatePhoneRule(User::TYPE_CLIENT),
            ],
            'email' => [
                'nullable',
                'email',
                new UpdateEmailRule(User::TYPE_CLIENT),
            ]
        ];
    }
 

Спасибо

Ответ №1:

В файле запроса php вы можете использовать эту функцию failedValidation() и передать валидатор. Таким образом, вы можете изменить или настроить ответ в случае сбоя проверки.

 use IlluminateHttpExceptionsHttpResponseException;
use IlluminateContractsValidationValidator;

    protected function failedValidation(Validator $validator) {
        throw new HttpResponseException(response()->json(['status'=>'failed',
                                                    'message'=>'unprocessable entity',
                                                    'errors'=>$validator->errors()->all()], 422));
    }
 

Образец ответа находится здесь..

 {
"status": "failed",
"message": "unprocessable entity",
"errors": [
    "The name must be a string.",
    "One or more users is required"
 ]
}
 

Как вы можете видеть, сообщение изменено, теперь вы можете делать с ответным сообщением все, что захотите.

Также вы можете попробовать это

 $validator->errors()->messages()[keyname]
 

Комментарии:

1. спасибо, это работа.

Ответ №2:

Вы должны использовать unique в своей проверке

 $this->validate(
    $request, 
    [   
        'email'             => 'required|unique:your_model_names',
        'phone'             => 'required|unique:your_model_names'
    ],
    [   
        'email.required'    => 'Please Provide Your Email Address For Better Communication, Thank You.',
        'email.unique'      => 'Sorry, This Email Address Is Already Used By Another User. Please Try With Different One, Thank You.',
        'phone.required' => 'Your custom message',
        'phone.unique'      => 'The phone has already been taken'
    ]
);
 

Комментарии:

1. спасибо, но это не тот результат, которого я ожидаю. большое спасибо

Ответ №3:

Вы можете сделать это в файле lang: resources/lang/en/validation.php . Если все, что вы хотите сделать, это изменить, например, сообщение для уникального правила в поле электронной почты во всем приложении, вы можете это сделать:

 /*
|--------------------------------------------------------------------------
| Custom Validation Language Lines
|--------------------------------------------------------------------------
|
| Here you may specify custom validation messages for attributes using the
| convention "attribute.rule" to name the lines. This makes it quick to
| specify a specific custom language line for a given attribute rule.
|
*/

'custom' => [
    'attribute-name' => [
        'rule-name' => 'custom-message',
    ],
    'email' => [
        'unique' => 'This email is already registered...etc',
    ]
],