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










