Laravel添加车辆API验证报BadMethodCallException错误求助
问题:汽车经销商API车辆添加接口验证错误
我正在开发一个汽车经销商的API(小型学校项目),在CarController处理添加车辆的POST请求时遇到数据验证问题。
接收的示例JSON数据:
{ "model": "Q5", "brand": "Audi", "year": 2008, "price": 44000, "color": "blue", "traction": "4x4", "motor": { "type": "gasoline", "hp": 256, "turbo": false, "cylinders": 4, "motor_liters": 2.0 }, "user_id": 1 }
我编写的验证规则:
$request->validate([ 'model' => 'required|string', 'brand' => 'required|string', 'year' => 'required|integer', 'price' => 'required|numeric', 'color' => 'required|string', 'traction' => 'required|string', 'motor' => [ 'type' => 'required|string', 'hp' => 'required|integer', 'turbo' => 'required|boolean', 'cylinders' => 'required|integer', 'motor_liters' => 'required|numeric' ], 'user_id' => 'required|integer' ]);
发起请求后,Validator抛出错误:
BadMethodCallException: Method Illuminate\Validation\Validator::validateRequired|string does not exist.
我不确定是拼写错误、格式问题还是嵌套JSON的处理方式有误,我的UserController中的POST请求验证运行正常:
$request->validate([ 'username' => 'required|string|min:5', 'password' => 'required|string' ]);
解决方法
问题出在嵌套字段motor的验证规则写法上。Laravel验证嵌套数组时,必须先给motor字段指定基础验证规则(比如required|array),再定义其内部字段的验证规则,否则框架会把内部字段的规则当成motor字段的验证规则,导致调用不存在的验证方法。
以下两种正确写法任选其一:
写法一:使用点语法
$request->validate([ 'model' => 'required|string', 'brand' => 'required|string', 'year' => 'required|integer', 'price' => 'required|numeric', 'color' => 'required|string', 'traction' => 'required|string', // 先验证motor是必填数组 'motor' => 'required|array', // 用点语法定义motor内部字段规则 'motor.type' => 'required|string', 'motor.hp' => 'required|integer', 'motor.turbo' => 'required|boolean', 'motor.cylinders' => 'required|integer', 'motor.motor_liters' => 'required|numeric', 'user_id' => 'required|integer' ]);
写法二:嵌套数组规则
$request->validate([ 'model' => 'required|string', 'brand' => 'required|string', 'year' => 'required|integer', 'price' => 'required|numeric', 'color' => 'required|string', 'traction' => 'required|string', 'motor' => [ 'required', 'array', // 嵌套定义内部字段规则 'type' => 'required|string', 'hp' => 'required|integer', 'turbo' => 'required|boolean', 'cylinders' => 'required|integer', 'motor_liters' => 'required|numeric' ], 'user_id' => 'required|integer' ]);
内容的提问来源于stack exchange,提问作者Alex Serafini
相关产品推荐
相关产品推荐

