Laravel 8 序列化表单数据验证失败 如何校验解析后的数组参数
问题解决办法
错误原因
Laravel 控制器默认引入的ValidatesRequests trait 提供的validate()方法,第一个入参要求必须是Illuminate\Http\Request 实例,你传入解析后的数组自然会报类型错误。同时你原代码里的验证规则写反了:手机号规则误写为email,邮箱规则误写为number,后续调整时要修正。
解决方案1:使用Validator门面验证数组(推荐,适配现有逻辑)
首先在控制器顶部引入Validator门面:
use Illuminate\Support\Facades\Validator;
修改GetForm方法即可,完全兼容你现有业务逻辑:
public function GetForm(Request $request) { $requestData = $request->all(); $input = []; parse_str($requestData['data'], $input); // 手动创建验证器验证数组 $validator = Validator::make($input, [ 'inputID' => ['required'], 'inputName' => ['required', 'string', 'max:255'], 'inputPhone' => ['required', 'string', 'min:9'], 'inputEmail' => ['required', 'string', 'email'], ]); // 验证失败自动抛出异常,返回422响应,前端axios的catch可直接捕获错误提示 $validated = $validator->validate(); return $validated; }
解决方案2:合并参数到原Request实例
如果你希望继续使用控制器自带的validate方法,也可以把解析出的表单参数合并到原Request实例中:
public function GetForm(Request $request) { $requestData = $request->all(); $input = []; parse_str($requestData['data'], $input); // 把解析后的参数合并到Request实例 $request->merge($input); // 此时可正常调用控制器自带的validate方法 $validated = $this->validate($request, [ 'inputID' => ['required'], 'inputName' => ['required', 'string', 'max:255'], 'inputPhone' => ['required', 'string', 'min:9'], 'inputEmail' => ['required', 'string', 'email'], ]); return $validated; }
额外优化建议
- 前端更新操作建议把
axios.get改成axios.post或axios.put,GET请求有长度限制,且不符合HTTP方法语义,更新类操作不建议用GET请求。 - 可以把表单参数的键名直接改成和User模型字段对应(比如把
inputName改成name),后续可以直接用$object->fill($validated)->save()简化赋值代码。
内容的提问来源于stack exchange,提问作者raza9798
相关产品推荐
相关产品推荐

