Настройка формата сброшенной ошибки — Laravel 5.3

Я хочу настроить формат сообщения об ошибке, которое появляется после того, как я что-то вроде $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() и это автоматически форматирует согласно моему требованию.

0

Решение

Чтобы изменить его, нужно создать класс, который расширяет 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
0

Другие решения

Попробуйте это в вашей модели,

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"]
}
}
0

По вопросам рекламы [email protected]