Laravel登录后报Attempt to read property "produits" on null错误如何解决?
问题原因
错误Attempt to read property "produits" on null的触发逻辑非常明确:
- 登录状态下
Auth::check()校验通过,进入分支获取到了登录用户实例 - 该登录用户尚未创建对应的
favorie(收藏夹)关联数据,因此$user->favorie返回值为null - 代码尝试读取
null的produits属性,直接触发报错 - 未登录状态下走
else分支直接返回空数组,不存在属性读取操作,因此运行正常
解决方案
方法1:后端增加空值判断(最快捷)
直接修改后端逻辑,判断收藏夹关联存在后再读取关联商品,不存在则返回空数组:
$currentTime = date("Y-m-d"); if(Auth::check()){ $user = Auth::user(); $favorie = $user->favorie; $favprds = $favorie ? $favorie->produits : []; }else{ $favprds = []; }
如果你的运行环境支持PHP7.4及以上版本,可以用null安全运算符进一步简化代码:
$currentTime = date("Y-m-d"); $favprds = Auth::check() ? (Auth::user()->favorie?->produits ?? []) : [];
方法2:新增用户自动创建默认收藏夹(根治问题)
可以在用户注册完成时自动生成默认收藏夹,从根源避免登录用户无收藏夹的情况。在App\Providers\AppServiceProvider的boot方法中新增以下逻辑即可:
use App\Models\User; public function boot() { User::created(function ($user) { $user->favorie()->create(); }); }
可选优化:简化Blade模板逻辑
你当前的模板用循环判断商品是否在收藏夹的写法效率较低,可直接用Laravel集合的contains方法替换所有循环代码,写法更简洁可读性更高:
@if($favprds->contains('id', $pro->id)) <div class="tinv-wishlist-clear"> <a style="color:red;" href="{{ url('deleteFavorie/'.$pro->id) }}"><i class="fa fa-heart"></i></a> </div> @else <div class="tinv-wishlist-clear"> <a style="color:#7f8c8d" href="{{ url('add-to-favorie/'.$pro->id) }}"><i class="klbth-icon-heart-1"></i></a> </div> @endif
内容的提问来源于stack exchange,提问作者Salamah Salamah
相关产品推荐
相关产品推荐

