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

19次阅读

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 实际响应规范。

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

text=ZqhQzanResources