Laravel 7.0注册自动登录报错:SessionGuard::login()需传入实现Authenticatable接口的实例,却传入数组
解决Laravel注册后自动登录报错:需传入Authenticatable实例而非数组的问题
首先咱们直击错误核心:SessionGuard::login()方法要求传入实现Authenticatable接口的实例(也就是你的User模型对象),但实际传了一个数组。结合你的场景,所有数据都能正常存入数据库,说明用户创建、分类关联的逻辑没问题,问题就出在RegisterController的create()方法返回值不对。
问题根源
Laravel默认的RegistersUsers trait里,register()方法会把create()的返回值直接传给login()方法。如果你的create()最后返回的不是User模型实例,而是数组(比如不小心返回了compact('user')这类组合数组),就会触发这个报错。
解决方案
检查你RegisterController里的create()方法,确保它最后返回的是User模型实例,而非数组或其他类型。给你一个正确的实现示例参考:
protected function create(array $data) { // 1. 创建User实例并写入数据库 $user = User::create([ 'name' => $data['name'], 'email' => $data['email'], 'password' => Hash::make($data['password']), // 你的餐厅专属字段,比如VAT信息 'vat' => $data['vat'], ]); // 2. 关联分类到中间表(注意:attach()返回的不是User实例,别覆盖$user变量) $user->categories()->attach($data['category_id']); // 假设前端提交的分类ID字段是category_id // 3. 必须返回User实例!这是关键 return $user; }
关键注意事项
- 不要把
attach()的结果赋值给$user:$user->categories()->attach(...)返回的是受影响的行数,不是User对象。如果写$user = $user->categories()->attach(...),会把$user变成数字,后续传给login()自然报错。 - 确认你的User模型默认继承了
Illuminate\Foundation\Auth\User,这个类已经实现了Authenticatable接口,无需额外处理。
快速验证
你可以在create()方法最后加一句调试代码,看看返回的内容:
dd($user); // 应该显示User模型对象,包含所有用户属性 return $user;
只要确保返回的是User实例,login()方法就能正常识别并自动登录新注册的餐厅用户了。
内容的提问来源于stack exchange,提问作者Giorgione
相关产品推荐
相关产品推荐

