У меня есть приложение Laravel 9, и я использую Vue 3 и Filepond для создания возможности загрузки изображений.
<template>
<file-pond
max-files = "1"
name = "images"
server = "/api/images"
accepted-file-types = "image/jpeg, image/png, image/gif, image/webp"
:files = "file"
/>
</template>
<script setup>
import vueFilePond from 'vue-filepond'
import 'filepond/dist/filepond.min.css'
const file = ''
</script>
Это очень просто, он в основном отправляет загруженный файл на сервер в конечной точке API в «/api/images», которая является конечной точкой API моего приложения Laravel, и она работает, как и ожидалось.
Однако, когда я пытаюсь проверить запрос в контроллере Laravel, я всегда получаю ответ перенаправления 302 обратно в свое приложение Vue 3. Вот как выглядит мой валидатор:
public function upload(Request $request)
{
$request->validate(
[
'image' => 'required|image|dimensions:min_width=1,max_height=1|max:4000',
]
);
if ($request->fails())
{
dd('Request failed. App should stop here.');
}
}
Я намеренно установил «max_height» в 1, чтобы проверка не прошла, для тестирования. Однако приложение не переходит к «Запрос не выполнен…», оно просто перенаправляет (302) пользователя вместо того, чтобы возвращать ошибки.
Я предполагаю, что Laravel по какой-то причине не распознает это как запрос AJAX. Потому что эти проверки запроса всегда работают идеально, если я отправлю простую форму Vue Axios. Я всегда получаю ошибки в формате JSON. Но здесь это не так.
Я пытался сделать это, и он успешно выдавал мне сообщение «Проверка не удалась»:
$validator = Validator::make($request->all(),
[
'image' => 'required|image|dimensions:min_width=1,min_height=1|max:4000',
]);
if ($validator->fails())
{
dd('Validator fails.');
}
Однако я хотел бы использовать здесь проверку формы запроса (чтобы я мог поместить содержимое логики проверки в свой файл spearate.)
Я хочу: когда проверка изображения не удалась -> Laravel должен вернуть ответ JSON со всеми ошибками. Точно так же, как когда проверка формы не удалась.
Хотя чего мне не хватает? Почему он не работает так, как должен в первой ситуации?
Вы в основном просто пропускаете заголовок accept
= application/json
Этот заголовок является единственной реальной разницей между вызовом ajax и обычным запросом, независимо от того, содержит ли маршрут «api» или нет.
Поскольку запрос ожидает ответ в формате json, обработчик исключений не будет отправлять перенаправление, а вместо этого вернет json ошибки. хотя ответ об ошибке исключения проверки или любая ошибка исключения.
Отлично, именно то, чего мне не хватало! Теперь все работает идеально!
Вы можете использовать классы Form Request, внутри которых у вас есть метод
failedValidation()
, который вы можете использовать для перенаправления вызова.