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
相关产品推荐
相关产品推荐

