
当使用 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 实际响应规范。
总结:该错误本质是类型误判,解决核心在于「看清数据结构、用对访问语法、做好空值防护」。