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

如何在PHP控制器中获取带ID后缀的动态请求参数值?

问题描述

前端通过JavaScript动态生成带任务ID后缀的表单控件,代码如下:

const placesMultiDestination = result.multi_destination.map((destination, i) => {
                return `
                <div class="row place-multi-destination">
                  <div class="col-md-6">
                    <div class="form-group">
                      <label>Destination Place ${i + 1}</label>
                      <textarea rows="2" name="origin_place_${destination.id}" class="form-control" required autofocus>${destination.destination_place}</textarea>
                    </div>
                  </div>

                  <div class="col-md-6">
                    <div class="form-group">
                      <label>Origin Address ${i + 1}</label>
                      <textarea rows="2" name="origin_address_${destination.id}" class="form-control" required autofocus>${destination.destination_address}</textarea>
                    </div> 
                  </div>
                </div>

                `
              }).join('')

后端PHP控制器尝试获取参数时,使用$request->destination_place_ . $task->id的写法得到的是字符串拼接结果,而非请求参数的实际值:

if (count($multiDestinationTask) > 0) {
            foreach ($multiDestinationTask as $task) {
                $task->destination_place = $request->destination_place_ . $task->id;
                $task->destination_address = $request->destination_address_ . $task->id;
                $task->destination_lat = $request->destination_lat_ . $task->id;
                $task->destination_lon = $request->destination_lon_ . $task->id;
                dd($task);
            }
        }

需要解决的问题:如何在控制器中根据ID正确获取这类带后缀的请求参数值?


解决方案

方法1:动态拼接参数名并使用input()方法获取

原来的写法错误在于把$request->destination_place_当作属性调用(实际会返回null或空值),再和ID拼接成字符串,而非获取对应参数的实际值。正确的做法是先拼接出完整的参数名,再通过input()方法获取:

if (count($multiDestinationTask) > 0) {
    foreach ($multiDestinationTask as $task) {
        $task->destination_place = $request->input('destination_place_' . $task->id);
        $task->destination_address = $request->input('destination_address_' . $task->id);
        $task->destination_lat = $request->input('destination_lat_' . $task->id);
        $task->destination_lon = $request->input('destination_lon_' . $task->id);
        
        dd($task);
    }
}

如果需要默认值,可在input()方法中传入第二个参数,比如$request->input('destination_place_' . $task->id, ''),避免参数不存在时返回null。

方法2:改用数组格式的表单name属性(更推荐)

前端生成表单时,将name属性改成数组结构,后端可以直接按数组批量获取参数,逻辑更清晰,也更易维护:

前端修改后的代码

const placesMultiDestination = result.multi_destination.map((destination, i) => {
    return `
    <div class="row place-multi-destination">
      <div class="col-md-6">
        <div class="form-group">
          <label>Destination Place ${i + 1}</label>
          <textarea rows="2" name="destinations[${destination.id}][place]" class="form-control" required autofocus>${destination.destination_place}</textarea>
        </div>
      </div>
      <div class="col-md-6">
        <div class="form-group">
          <label>Origin Address ${i + 1}</label>
          <textarea rows="2" name="destinations[${destination.id}][address]" class="form-control" required autofocus>${destination.destination_address}</textarea>
        </div> 
      </div>
      <!-- 纬度、经度控件同理修改name为destinations[${destination.id}][lat]、destinations[${destination.id}][lon] -->
    </div>
    `
}).join('')

后端获取代码

// 一次性获取所有目的地参数数组,第二个参数为空数组作为默认值
$destinations = $request->input('destinations', []);

if (count($multiDestinationTask) > 0) {
    foreach ($multiDestinationTask as $task) {
        // 通过ID直接从数组中取值,用?? ''避免索引不存在时报错
        $task->destination_place = $destinations[$task->id]['place'] ?? '';
        $task->destination_address = $destinations[$task->id]['address'] ?? '';
        $task->destination_lat = $destinations[$task->id]['lat'] ?? '';
        $task->destination_lon = $destinations[$task->id]['lon'] ?? '';
        
        dd($task);
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 07:35:29