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

尝试读取null对象的id属性报错,需协助排查订阅功能问题

错误分析与解决方案

问题概述

执行订阅操作时触发致命错误:Attempt to read property "id" on null,错误发生在文件/home/ssmkngbx/domains/royaleg.co/public_html/platform/plugins/real-estate/src/Providers/HookServiceProvider.php中。

错误定位

从代码片段可明确,错误触发在尝试访问$package->id的位置:

$products = [
    [
        'id' => $package->id, // 此处报错,$package为null
        'name' => $package->name,
        'price' => $package->price,
        'price_per_order' => $package->price,
        'qty' => 1,
    ],
];

$package由以下逻辑获取:

$orderIds = [session('subscribed_packaged_id')];
$package = $this->app->make(PackageInterface::class)->findById(Arr::first($orderIds));

根本原因

$package为null,对应两种场景:

  1. 会话中不存在subscribed_packaged_id值,导致Arr::first($orderIds)返回null,调用findById(null)无法获取套餐数据;
  2. 会话中存在subscribed_packaged_id,但该ID对应的套餐在数据库中不存在,findById返回null。

解决方案

1. 验证会话数据

在获取$package前添加调试代码,确认会话值是否正常:

$subscribedId = session('subscribed_packaged_id');
\Log::info('会话中的套餐ID:' . $subscribedId); // 写入日志查看具体值

如果日志显示$subscribedId为空,需检查订阅流程的前置环节——用户选择套餐后,是否正确执行了session()->put('subscribed_packaged_id', 目标套餐ID)的操作。

2. 增加空值防护逻辑

在使用$package属性前必须判断其是否存在,避免直接访问属性触发错误:

$packageId = Arr::first($orderIds);
$package = $this->app->make(PackageInterface::class)->findById($packageId);

if (!$package) {
    // 根据业务场景处理,比如抛出异常或引导用户重新选择套餐
    throw new \RuntimeException('所选套餐不存在,请重新选择');
}

// 后续正常使用$package的属性

3. 检查数据库数据

如果会话中的套餐ID存在,直接查询数据库的套餐表,确认该ID对应的记录是否存在。若记录已被删除或未正确创建,需恢复或补充对应数据。

补充信息

  • 订阅操作入口:账号套餐3的订阅页面
  • 测试账号:用户名test,密码123456
  • 管理员账号:用户名helper,密码123456,货币设置路径:左侧菜单→Real Estate→Setting(此为普通管理员账号,无数据安全风险)

内容的提问来源于stack exchange,提问作者Helw Dev

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 02:20:17