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

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:报错
问题原因

报错由两个问题共同导致:

  1. 核心原因:控制器中成功处理完SOAP返回数据后,调用json_encode()将原本的数组类型$x3users转成了JSON格式的字符串,PHP的foreach无法直接遍历字符串类型变量,因此抛出参数无效错误。你用{{ }}能正常输出是因为字符串可以直接被打印,不代表它是可遍历的数组结构。
  2. 隐藏兼容问题:当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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 20:03:24