所以我有一个包含验证规则和一些消息的表单请求。
这是我在控制器中的功能(通过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,但是它不会通过正常的验证过程。
答案 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());
}