Laravel 8 手动实例化FormRequest调用validated()返回null错误问询
问题根源
- Laravel 的 FormRequest 类依赖服务容器自动解析触发验证流程,你直接手动
new StoreCarRequest($t)实例化的操作,只会初始化请求参数,不会自动执行验证逻辑,验证器未初始化的情况下调用validated()方法,自然会抛出空对象成员方法调用错误。 - 你当前跨控制器调用方法的写法本身也不符合Laravel的最佳实践,容易出现此类依赖缺失的问题。
解决方案
方案1:手动触发FormRequest验证流程
如果要保留现有跨控制器调用的写法,只需要修改CarItalianController的store方法,手动执行FormRequest的验证流程即可:
class CarItalianController extends Controller { public function store(StoreCarItalianRequest $request) { $input_parameters = $request->validated(); $t = [ 'model' => $input_parameters['modello'], 'door' => $input_parameters['porte'], ]; // 用容器实例化FormRequest,完成初始化 $storeCarRequest = app(StoreCarRequest::class)->replace($t); // 手动触发验证逻辑 $storeCarRequest->validateResolved(); return (new CarController)->store($storeCarRequest); } }
方案2(更推荐):提取公共业务逻辑
建议把车辆创建的逻辑抽成独立的服务类,避开手动处理FormRequest的坑,同时提升代码复用性:
- 新增
CarService服务类
class CarService { public function createCar(array $validatedData) { return Car::create($validatedData); } }
- 修改
CarController
class CarController extends Controller { public function store(StoreCarRequest $request, CarService $carService) { return $carService->createCar($request->validated()); } }
- 修改
CarItalianController
class CarItalianController extends Controller { public function store(StoreCarItalianRequest $request, CarService $carService) { $input_parameters = $request->validated(); $t = [ 'model' => $input_parameters['modello'], 'door' => $input_parameters['porte'], ]; return $carService->createCar($t); } }
内容的提问来源于stack exchange,提问作者vlauciani
相关产品推荐
相关产品推荐

