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-ответ