Laravel 5 Validation - Возвращение как json/ajax

Я пытаюсь опубликовать значения в валидации и вернуть ответ как json, а не return view, как указано в документации.

    $validator = Validator::make($request->all(), [
        'about' => 'min:1'
    ]);

    if ($validator->fails()) {
        return response()->json(['errors' => ?, 'status' => 400], 200);
    } 

Сообщение сделано ajax, поэтому мне нужно также получить ответ в ajax.

Я понял, что, чтобы предотвратить обновление страницы в возвращаемом ответе, я должен предоставить код статуса 200 вне массива. Но я не мог понять, что дать часть 'errors'. Что мне там писать?

Ответ 1

Вы можете использовать $validator->messages(), который возвращает массив, который содержит всю информацию о валидаторе, включая ошибки. Функция json принимает массив и кодирует его как строку json.

if ($validator->fails()) {    
    return response()->json($validator->messages(), 200);
}

Ответ 2

В Laravel 5.4 метод validate() может автоматически определить, является ли ваш запрос запросом AJAX, и соответствующим образом отправить ответ валидатора.

Смотрите документацию здесь

Если проверка не пройдена, будет сгенерирован ответ о перенаправлении, чтобы отправить пользователя обратно в его предыдущее местоположение. Ошибки также будут мигать в сеансе, чтобы они были доступны для отображения. Если запрос был запросом AJAX, пользователю будет возвращен HTTP-ответ с кодом состояния 422, включая JSON-представление ошибок проверки.

Таким образом, вы можете просто сделать следующее:

Validator::make($request->all(), [
    'about' => 'min:1'
])->validate();

Ответ 3

Я полагаю, что если вы отправите запрос Ajax, вы получите ответ JSON автоматически.

Может быть, что-то вроде этого будет уместным на основе вашего примера:

$validator = \Validator::make($request->all(), $this->rules());

if ($validator->fails()) {
   return response()->json($validator->errors(), 422)
}

Ответ 4

Те, кто создал пользовательский класс запроса, могут переопределить метод public function response(array $errors) и явно вернуть измененный ответ без Validator.

use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Http\JsonResponse;

class CustomRequest extends FormRequest
{

    public function rules()
    {
        $rules = [
            //custom rules    
        ];

        return $rules;
    }

    public function response(array $errors)
    {
        return new JsonResponse(['error' => $errors], 400);
    }
}

Ответ 5

Я использую ниже этот код для API в моем существующем проекте.

$validator = Validator::make($request->all(), [ 
      'ride_id' => 'required',
      'rider_rating' => 'required',
  ]);

  if ($validator->fails()) {
    return response()->json($validator->errors(), 400);
  }

Ответ 6

Вы просто должны сказать Laravel, что хотите получить ответ JSON. Добавьте этот заголовок к вашему запросу:

'Accept: application/json'

И Laravel автоматически вернет JSON-ответ