You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:45:43