Laravel 9:Trait中使用验证时出现参数类型不匹配问题求助
问题描述
我创建了一个供控制器使用的Trait,控制器需调用Trait中的方法来验证输入并执行逻辑。
在FooController.php中:
[..] $do_stuff = $this->create_stuff($input);
Trait代码如下:
<?php namespace App\Traits; use Illuminate\Http\Request; use Illuminate\Support\Str; [..] use Illuminate\Support\Facades\Validator; trait Foo { public function create_stuff(Request $input) { // 验证部分 $validatedData = $input->validate([ 'Value' => 'required|numeric', ]); // 验证结束 [..]
未添加验证时一切正常,添加后出现错误:
Argument 1 passed to App\Http\Controllers\FooController::create_stuff() must be an instance of Illuminate\Http\Request, instance of stdClass given,[..]
已知$input是普通PHP对象,而验证仅适用于Request对象,请问该如何解决此问题?
解决方案
有两种实用的解决思路,可根据场景选择:
思路一:手动用Validator类验证
把stdClass对象转为数组,直接用Validator门面完成验证,不依赖Request的validate方法:
use Illuminate\Support\Facades\Validator; use Illuminate\Validation\ValidationException; public function create_stuff($input) { // 将stdClass转为数组 $inputArray = (array) $input; // 构建验证规则并执行验证 $validator = Validator::make($inputArray, [ 'Value' => 'required|numeric', ]); // 验证失败时抛出异常,和Request::validate行为一致 if ($validator->fails()) { throw new ValidationException($validator); } // 获取验证通过的数据 $validatedData = $validator->validated(); // 后续业务逻辑 [..] }
思路二:将stdClass转为Request对象
如果想继续使用Request的validate方法,可把stdClass包装成Request实例:
use Illuminate\Http\Request; public function create_stuff($input) { // 将stdClass转为数组后创建Request实例 $request = new Request((array) $input); // 正常调用validate方法 $validatedData = $request->validate([ 'Value' => 'required|numeric', ]); // 后续业务逻辑 [..] }
补充说明
- 第一种思路更轻量,无需额外创建Request对象,适合仅需验证的场景;
- 第二种思路可保留Request类的全部方法,若后续需要用到请求头、文件处理等功能,优先选这种。
内容的提问来源于stack exchange,提问作者Dominic
相关产品推荐
相关产品推荐

