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

Laravel 6 如何在请求发送至验证层前修改传入的XML请求数据?

解决方案

Laravel 6 自带验证前置处理的内置功能,你只需要重写自定义 FormRequest 类的 prepareForValidation 方法即可,该方法会在权限校验通过后、验证规则执行前自动触发,完全符合你修改请求内容的需求。

你可以在该方法中完成XML解析、提取需要的字段,再合并到请求数据中,后续验证、业务逻辑都可以直接使用处理好的字段,无需重复解析XML。


修改后的代码示例

<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Support\Facades\Gate;

class BankStatementsRequest extends FormRequest
{
    /**
     * Determine if the user is authorized to make this request.
     *
     * @return bool
     */
    public function authorize()
    {
        return Gate::inspect('Broker');
    }

    /**
     * 验证前置处理:解析XML并合并需要的字段到请求
     */
    protected function prepareForValidation()
    {
        // 示例:从请求体中获取原始XML内容,若XML是上传文件可改为 $this->file('xml_file') 读取
        $xmlRaw = $this->getContent();
        // 解析XML,大型XML建议用XMLReader逐节点读取所需字段,避免内存溢出
        $xmlObj = simplexml_load_string($xmlRaw);
        
        // 把需要的字段合并到请求参数中
        $this->merge([
            'statement_id' => (string) $xmlObj->statement_id,
            'bank_code' => (string) $xmlObj->bank->code,
            'total_amount' => (float) $xmlObj->summary->total_amount,
            // 其他你需要用到的字段
        ]);
    }

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules()
    {
        return [
            'statement_id' => 'required|string|max:64',
            'bank_code' => 'required|string|size:4',
            'total_amount' => 'required|numeric|min:0',
            // 其他字段的验证规则
        ];
    }
}

注意事项

  • 若XML作为文件上传,可通过 $this->file('上传字段名') 获取文件对象,再读取文件内容解析即可
  • 处理大型XML不建议使用 simplexml_load_string 全量加载,改用XMLReader类逐节点读取你需要的字段即可,避免占用过高内存
  • 若XML解析失败可直接在该方法中抛出对应异常,提前终止请求流程,无需走到后续验证环节

内容的提问来源于stack exchange,提问作者Kurt

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 03:09:03