Laravel视图遍历json_encode处理的SOAP响应报foreach参数错误
问题描述
在Laravel项目中处理SOAP接口响应时遇到遍历报错,控制器对应实现代码如下:
public function users() { $user = Auth::user(); $users = User::all(); // webservice X3 $soapclient = new SoapClient($this->WSDL, $this->params); // method x3 $wsname = 'ZWSUSR01'; $xml='<?xml version="1.0" encoding="utf-8"?>'; $xml.='<PARAM>'; $xml.='</PARAM>'; $result = $soapclient->run($this->CContext, $wsname, $xml); $status = $result->status; $i=0; if ($status == 1) { $xml = simplexml_load_string($result->resultXml); foreach ($xml->TAB->LIN as $line) { $x3users[$i]= array(); foreach ($line->FLD as $name) { $x3users[$i]["".$name['NAME'].""] = (string)$name; } $i++; } $x3users= json_encode($x3users, JSON_UNESCAPED_UNICODE ); } else { $message = $result->resultXml; $vars = array( 'xwebservice' => $wsname, 'xident' => $id, 'xmessage' => $message ); $this->erroRotinas($vars); $xml=''; } return view('configs.users', compact(['users', 'x3users'])); }
变量传递到视图后存在以下现象:
- 使用
{{ $x3users }}输出时,可正常得到格式为[{...},{...},{...}]的JSON结果 - 使用
@foreach($x3users as $x3user)遍历该变量时,会抛出Invalid argument supplied for foreach() (View:报错
问题原因
报错由两个问题共同导致:
- 核心原因:控制器中成功处理完SOAP返回数据后,调用
json_encode()将原本的数组类型$x3users转成了JSON格式的字符串,PHP的foreach无法直接遍历字符串类型变量,因此抛出参数无效错误。你用{{ }}能正常输出是因为字符串可以直接被打印,不代表它是可遍历的数组结构。 - 隐藏兼容问题:当SOAP接口返回状态不等于1时,代码中没有定义
$x3users变量,直接传到视图会触发变量未定义的报错,也可能导致遍历失败。
解决方法
按照优先级推荐以下修复方案:
- 优先调整控制器传参逻辑:删掉成功分支里的
$x3users= json_encode($x3users, JSON_UNESCAPED_UNICODE );代码,直接将解析好的数组传给视图即可。如果视图中某一处需要输出JSON格式字符串,直接在视图对应位置用Blade自带的@json($x3users)指令输出,不需要在控制器层提前做编码转换。 - 给异常分支补默认值:在
else代码块中添加$x3users = [];,保证接口请求失败时,视图拿到的依然是可遍历的空数组,不会触发变量未定义、遍历参数无效的报错。 - 如果你确实需要在控制器层提前把数据转成JSON字符串传递,那在视图遍历前必须先做解码转数组操作,遍历写法参考:
@foreach(json_decode($x3users, true) as $x3user) {{-- 这里写你的单条用户数据遍历逻辑 --}} @endforeach
内容的提问来源于stack exchange,提问作者Rui Leming
相关产品推荐
相关产品推荐

