Laravel自定义FormRequest丢失questions_img数组问题求助
问题原因及解决方案
这个问题我之前踩过类似的坑,核心原因是你在自定义FormRequest的rules()方法里,获取上传文件数组的方式不对,导致验证规则没正确添加,最终文件字段在验证流程中丢失了。
具体原因分析
Laravel中,上传的文件数据是单独存在请求的files集合里的,不属于普通的POST表单数据。你原来的代码里用$this->request->get('questions_img')去获取这个数组,返回的其实是null——因为这个方法只能拿到普通文本字段,拿不到文件。这样一来,循环添加questions_img.*验证规则的代码根本不会执行,FormRequest也就不知道要处理这些文件字段。
而当使用自定义FormRequest时,Laravel的验证流程会默认只保留通过验证的字段,没有定义规则的字段会被过滤掉,这就是为什么你在控制器里拿不到questions_img数组的原因。普通的Request类没有这个验证过滤的步骤,所以能正常获取所有数据。
两种解决方案
方案一:直接定义动态规则(推荐)
既然questions_img是动态添加的数组,你可以直接在规则里用通配符*来匹配所有元素,不用循环:
namespace App\Http\Requests; use Illuminate\Foundation\Http\FormRequest; class StoreProject extends FormRequest { public function authorize() { return true; } public function rules() { $rules = [ 'title' => 'required', 'category_id' => 'required', 'description' => 'required', 'order' => 'required', 'featured_img' => 'image', 'skill_level' => 'required|string', // 直接添加动态规则,匹配所有questions_img下的元素 'questions_img.*' => 'image' ]; // 处理contributors的动态规则(如果需要) $contributors = $this->request->get('contributors'); if ($contributors) { foreach ($contributors as $key => $val) { $rules['contributors.' . $key] = 'required'; $rules['contributors_amount.' . $key] = 'required|numeric'; } } return $rules; } }
方案二:正确获取文件数组循环添加规则
如果你需要对每个图片字段设置不同的验证规则,可以用$this->file('questions_img')来正确获取文件数组:
namespace App\Http\Requests; use Illuminate\Foundation\Http\FormRequest; class StoreProject extends FormRequest { public function authorize() { return true; } public function rules() { $rules = [ 'title' => 'required', 'category_id' => 'required', 'description' => 'required', 'order' => 'required', 'featured_img' => 'image', 'skill_level' => 'required|string' ]; // 正确获取上传的文件数组 $questionsImgs = $this->file('questions_img'); if ($questionsImgs) { foreach ($questionsImgs as $key => $val) { $rules['questions_img.' . $key] = 'image'; // 这里可以添加其他规则,比如max:2048(限制文件大小2MB) } } // 处理contributors的动态规则 $contributors = $this->request->get('contributors'); if ($contributors) { foreach ($contributors as $key => $val) { $rules['contributors.' . $key] = 'required'; $rules['contributors_amount.' . $key] = 'required|numeric'; } } return $rules; } }
验证后如何获取数据
修改完规则后,你在控制器里可以通过以下方式获取文件数组:
// 获取所有问题图片文件 $questionImages = $request->file('questions_img'); // 或者获取单个图片 $firstQuestionImage = $request->file('questions_img.1');
内容的提问来源于stack exchange,提问作者rushtoni88
相关产品推荐
相关产品推荐

