Как настроить пользовательский ответ для выбранного класса запросов в Laravel 5.5
Я пытаюсь использовать проверку Laravel для создания пользовательского сообщения об ошибке, однако я не могу найти функцию, которую я должен переопределить.
Маршрут: POST:/entries/
использования EntryController@store
который использует EntryStoreRequest
выполнить проверку.
EntryStoreRequest
namespace App\Api\V1\Requests;
class EntryStoreRequest extends ApiRequest
{
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
return [
'message' => [
'string',
'required',
'max:65535',
],
'code' => [
'string',
'max:255',
'nullable'
],
'file' => [
'string',
'max:255',
'nullable'
],
'line' => [
'string',
'max:255',
'nullable'
],
'stack' => [
'string',
'max:65535',
'nullable'
]
];
}
}
ApiRequest
namespace App\Api\V1\Requests;
use Illuminate\Foundation\Http\FormRequest;
abstract class ApiRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
return true;
}
}
В настоящее время ошибки возвращаются как:
{
"message": "The given data was invalid.",
"errors": {
"message": [
"The message field is required."
]
}
}
Я хочу отформатировать их как:
{
"data": [],
"meta: {
"message": "The given data was invalid.",
"errors": {
"message": [
"The message field is required."
]
}
}
Как я могу добиться этого в течение ApiRequest
учебный класс?
2 ответа
Если вы хотите настроить ответ проверки только для выбранного класса запроса, вам нужно добавить failedValidation()
сообщение для этого класса:
protected function failedValidation(\Illuminate\Contracts\Validation\Validator $validator)
{
$response = new JsonResponse(['data' => [],
'meta' => [
'message' => 'The given data is invalid',
'errors' => $validator->errors()
]], 422);
throw new \Illuminate\Validation\ValidationException($validator, $response);
}
Таким образом, вам не нужно ничего менять в Handler и иметь этот пользовательский ответ только для этого отдельного класса.
И если вы хотите изменить формат глобально для всех ответов, вы должны добавить в app\Exceptions\Handler.php
подайте следующий метод:
protected function invalidJson($request, ValidationException $exception)
{
return response()->json([
'data' => [],
'meta' => [
'message' => 'The given data is invalid',
'errors' => $exception->errors()
]
], $exception->status);
}
Вы можете прочитать об этом также в Руководстве по обновлению в разделе " Формат исключения ".
Для тех, кто не хочет использовать JsonResponse, вот что я сделал для своего
protected function failedValidation(Validator $validator) {
// if you want, log something here with $this->validationData(), $validator->errors()
$response = redirect($this->getRedirectUrl())
->with('var1', 'my var 1') // custom flash variable to send if needed
->with('var2', 'my var 2')
->withErrors($validator)
->withInput();
throw new ValidationException($validator, $response);
}