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

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


这是我在控制器中的函数(通过 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,但它不会通过正常的验证过程。


郎朗坤
浏览 137回答 3
3回答

三国纷争

我也遇到了同样的问题。如果您的验证代码在 try 块中,您将收到“给定的数据无效”错误。从 try 块中删除它,您将获得 Laravel 给出的正确错误响应。

湖上湖

当你删除你的messages()功能时会发生什么?(date_format:Y-m-s好像错了,不应该date_format:Y-m-d吗?)

呼唤远方

验证器抛出一个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());}
打开App,查看更多内容
随时随地看视频慕课网APP