使用表单请求时,Laravel的“给定数据无效”

时间:2019-05-15 13:44:30

标签: php laravel laravel-5

所以我有一个包含验证规则和一些消息的表单请求。

这是我在控制器中的功能(通过vue.axios调用)

public function store(TaskFormRequest $request, TaskService $service): JsonResponse
{
    $data = $request->validated();

    if (!$task = $service->create($data)) {
        return JsonResponse::create(['message' => __('Can\'t create Task')], 400);
    }

    return JsonResponse::create(
        [
            'task_id' => $task->id,
            'message' => __('Task was successfully added.'),
        ]
    );
}

它工作正常,除了在未验证数据时调用存储(并且将$ request视为TaskFormRequest实例)的那一刻之外,它还会返回“给定数据无效” JsonResponse,以及来自表单的错误消息

这很好,但是消息本身深埋在Vendor中,如果没有麻烦,我无法在其上应用任何翻译。

这是我的表单请求:

public function authorize(): bool
{
    return $this->user()->role === 'administrator';
}

public function rules(): array
{
    return [
        'subject' => 'required',
        'date' => 'nullable|date_format:Y-m-s',
        'user' => 'nullable|exists:users,id',
        'task_list_id' => 'required|exists:task_lists,id',
        'privacy' => 'array',
    ];
}

public function messages() {
    return [
        'subject.required' => __("Task name is empty")
    ];
}

我希望所有人停止此响应,只保留表格中的错误。或者至少自定义它。

编辑:我认为问题在于请求为空?如果我在null函数的参数中输入了store的默认值,则可以检查空的$ request并返回JsonResponse,但是它不会通过正常的验证过程。

3 个答案:

答案 0 :(得分:1)

我也在同一个问题上挣扎。如果您的验证代码在try块中,则会出现“给定数据无效”错误。从try块中删除它,您将获得Laravel给出的正确的错误响应。

答案 1 :(得分:0)

删除messages()函数会发生什么?

({date_format:Y-m-s似乎是错误的,应该不应该是date_format:Y-m-d吗?)

答案 2 :(得分:0)

验证器会抛出一个Illuminate\Validation\ValidationException,您可以在App\Exceptions\Handler->render()中拦截它,然后将其发送给供应商的父类。

if ($exception instanceof ValidationException) {
    //choose the structure you want. the Validation exception has many methods
    return response()->json(['status' => 'error', 'message' => $exception->getMessage()], 422);
}

编辑: 要拦截表单请求本身中的错误,请声明以下方法:

public function failedValidation(\Illuminate\Contracts\Validation\Validator $validator)
{
    throw (new \Illuminate\Validation\ValidationException($validator))
                ->errorBag($this->errorBag)
                ->redirectTo($this->getRedirectUrl());
}