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

