Как установить собственный ответ для выбранного класса запроса в 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'
            ]
        ];
    }
}

АпиЗапрос

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?


person eithed    schedule 10.10.2017    source источник


Ответы (1)


Если вы хотите настроить ответ проверки только для выбранного класса запроса, вам нужно добавить 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);
}

Таким образом, вам не нужно ничего менять в обработчике и иметь этот пользовательский ответ только для этого одного класса.

И если вы хотите изменить формат глобально для всех ответов, вы должны добавить в файл 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);
}

Вы также можете прочитать об этом в руководстве по обновлению в разделе Формат исключений.

person Marcin Nabiałek    schedule 10.10.2017
comment
Разве это не будет определять такие ответы для всех проверок? Что я могу сделать, чтобы определить вышеупомянутый формат только для данного класса запроса? - person eithed; 10.10.2017
comment
Глупый я - я смотрел на этот метод раньше и даже переопределил его в классе ApiRequest как protected function failedValidation(Validator $validator), которому я получил Class App\Api\V1\Requests\EntryStoreRequest does not exist, который на самом деле ничего не объясняет. Ваш ответ дал мне объяснение и этому :) Спасибо! - person eithed; 10.10.2017
comment
Спасибо за ответ. Меня устраивает. Действительно полезно. Спасибо @MarcinNabiałek - person Saifur Rahman; 21.06.2018