尝试读取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,对应两种场景:
- 会话中不存在
subscribed_packaged_id值,导致Arr::first($orderIds)返回null,调用findById(null)无法获取套餐数据; - 会话中存在
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
相关产品推荐
相关产品推荐

