Laravel 中处理 API 返回数组时的常见错误:非对象属性访问问题

当使用 laravel 从 api(如 rawg)获取数据时,若误将数组当作对象访问(如 `$result->name`),会触发 “trying to get property 'name' of non-object” 错误;根本原因是 api 响应为关联数组而非 stdclass 对象,需统一使用数组语法访问。

在调用类似 RAWG 这类 RESTful API 时,第三方 SDK(如 \Rawg::load('games')->get())通常默认返回的是 关联数组(尤其是 JSON 解析后未强制转为对象),而非 PHP 对象。因此,直接使用对象箭头语法($result->name)会导致运行时错误 —— 因为 $result 实际是 array 类型,不支持 -> 访问。

正确做法是:
✅ 明确识别响应结构(可通过 dd($response) 或 var_dump($response) 调试);
✅ 确认数据位于 $response['results'](而非直接遍历 $response);
✅ 所有字段均使用数组下标语法($result['key']),嵌套结构同理。

以下是修正后的完整示例代码:

$response = \Rawg::load('games')
    ->setParams([
        'page' => 1,
        'page_size' => 40,
        'ordering' => '-rating',
    ])
    ->get();

// 关键修正:遍历 $response['results'],且全部使用数组语法
if (isset($response['results']) && is_array($response['results'])) {
    foreach ($response['results'] as $result) {
        // 注意:ratings 和 platforms 均为数组,需校验索引存在性
        $ratingTitle = !empty($result['ratings'][0]['title']) 
            ? $result['ratings'][0]['title'] 
            : null;

        $platformName = !empty($result['platforms'][0]['platform']['name']) 
            ? $result['platforms'][0]['platform']['name'] 
            : null;

        Games::insert([
            'name' => $result['name'] ?? 'Unknown Game',
            'ratings' => $ratingTitle,
            'platforms' => $platformName,
        ]);
    }
}

⚠️ 重要注意事项

  • 永远不要假设嵌套数组索引一定存在 —— ratings[0] 或 platforms[0] 可能为空或缺失,务必使用 !empty() 或 ?? 提供默认值,避免“Undefined index”错误;
  • 若需更健壮的数据提取逻辑,建议封装为辅助方法或使用 Laravel 的 data_get() 辅助函数(例如:data_get($result, 'ratings.0.title'));
  • 如需强制返回对象,可在 HTTP 客户端层设置 json_decode($json, false),但需确保 SDK 支持该配置;多数情况下,适配数组结构更安全、更符合 REST API 实际响应规范。

总结:该错误本质是类型误判,解决核心在于「看清数据结构、用对访问语法、做好空值防护」。