Как изменить ответ валидатора в Laravel?
Я пишу api для своего приложения. Решил вынести всю валидацию в отдельные request, как рекомендуется в документации по Laravel 8. Но мне мне непонятно как я могу кастомизировать ответ в случае валидационной ошибки, так как мой клиент ожидает ответ в виде json с ключем status: false.
Вот мой контроллер
public function store(StoreChatroomRequest $request)
{
$request_data = $request->validated();
...
}
Вот StoreChatroomRequest
public function messages()
{
return [
'title.required' => 'Поле title является обязательным',
'sender_id.required' => 'Поле sender_id является обязательным',
'receiver_id.required' => 'Поле receiver_id является обязательным'
];
}
public function rules()
{
return [
'title' => 'required|string|min:1',
'sender_id' => 'required|integer',
'receiver_id' => 'required|integer'
];
}
Когда я получаю валидационную ошибку, то в ответ о тсервера приходит следующий JSON
{
"message": "The given data was invalid.",
"errors": {
"title": [
"Поле title является обязательным"
],
"sender_id": [
"Поле sender_id является обязательным"
],
"receiver_id": [
"Поле receiver_id является обязательным"
]
}
}
Однако, я хотел бы видеть что-то вроде такого
{
"status": true,
"errors": {
...
}
}
Ответы (2 шт):
можно переопредилить метод failedValidation(Validator $validator) в классе StoreChatroomRequest и сформировать там exception с нужной структурой
В файле app/Exceptions/Handler.php Вы можете переопределить следующие функции для того, чтобы ответы применялись к любому запросу (как валидация, так и исключения):
// В шапку
use Illuminate\Support\Arr;
use Illuminate\Validation\ValidationException;
use Throwable;
public function convertValidationExceptionToResponse(ValidationException $e, $request)
{
if($e instanceof ValidationException && $request->expectsJson()) {
return response()->json([
"status" => false,
"messages" => ['You have errors in form'],
"errors" => $e->errors()
], 422);
} else {
parent::convertValidationExceptionToResponse($e, $request);
}
}
public function convertExceptionToArray(Throwable $e)
{
return config('app.debug') ? [
'status' => false,
'messages' => [$e->getMessage()],
'exception' => get_class($e),
'file' => $e->getFile(),
'line' => $e->getLine(),
'trace' => collect($e->getTrace())->map(function ($trace) {
return Arr::except($trace, ['args']);
})->all(),
] : [
'status' => false,
'messages' => [$e->getMessage()],
];
}