Я хочу настроить формат сообщения об ошибке, которое появляется после того, как я что-то вроде $this->validator($request->all())->validate();
На запрос ajax он отвечает:
{
"name": [
"The name field is required."],
"email": [
"The email field is required."],
}
Но я хочу, чтобы это выглядело как
{
"status": "fail",
"errors": {
"name": [
"The name field is required."],
"email": [
"The email field is required."],
}
}
Я прочитал документация под Настройка формата сброшенной ошибки и добавил formatValidationErrors
метод в моем Controller
класс, но это не имеет никакого значения.
public function formatValidationErrors(Validator $validator)
{
return ['status' => 'fail', 'errors' => $validator->errors()->getMessages()];
}
Это не меняется, даже если я меняюсь formatValidationErrors
метод в оригинале Illuminate\Foundation\Validation\ValidatesRequests
черта характера
Я вынужден создавать этот формат во всех вызовах запросов, поэтому существует дублирование кода. Было бы хорошо, если бы я мог просто позвонить $this->validator($request->all())->validate()
и это автоматически форматирует согласно моему требованию.
Чтобы изменить его, нужно создать класс, который расширяет Validator и переопределить метод addError. Вот пример кода:
<?php
namespace App\Validators;
use Illuminate\Support\MessageBag;
use Illuminate\Validation\Validator;
class RestValidator extends Validator {
/**
* Add an error message to the validator's collection of messages.
*
* @param string $attribute
* @param string $rule
* @param array $parameters
* @return void
*/
protected function addError($attribute, $rule, $parameters)
{
$message = $this->getMessage($attribute, $rule);
$message = $this->doReplacements($message, $attribute, $rule, $parameters);
$customMessage = new MessageBag();
$customMessage->merge(['code' => strtolower($rule.'_rule_error')]);
$customMessage->merge(['message' => $message]);
$this->messages->add($attribute, $customMessage);
}
}
Теперь вы можете структурировать валидацию в своих контроллерах следующим образом:
$rules = [
// Your rules here
];
$attributes = [
// The attributes you're checking here
];
$validator = Validator::make($attributes, $rules);
if ($validator->fails()) {
$errorMessage = [
'status' => 'fail',
'errors' => $validator->errors()
];
return $errorMessage;
}
// The rest of your code goes here
Попробуйте это в вашей модели,
public function response(array $errors)
{
if (($this->ajax() && !$this->pjax()) || $this->wantsJson()) {
$errors = array('status' => 'fail', 'errors' => $errors);
return new JsonResponse($errors, 422);
}
return $this->redirector->to($this->getRedirectUrl())
->withInput($this->except($this->dontFlash))
->withErrors($errors, $this->errorBag);
}
Это приведет, как вы ожидали,
{
"status": "fail",
"error": {
"name": [
"The name field is required."],
"email": [
"The email field is required"]
}
}