Laravel:Auth :: user()-> id 试图获取非对象属性

138

在提交一个表单添加用户时,我遇到了以下错误:"trying to get a property of a non-object",这个错误显然出现在以下第一行代码中:Auth::user()->id。

$id = Auth::user()->id;
$currentuser = User::find($id);
$usergroup = $currentuser->user_group;
$group = Sentry::getGroupProvider()->findById($usergroup);

$generatedPassword = $this->_generatePassword(8,8);
$user = Sentry::register(array('email' => $input['email'], 'password' => $generatedPassword, 'user_group' => $usergroup));

$user->addGroup($group);

有什么想法吗?我已经搜索了一段时间,看到的所有内容都说这应该可以正常工作。我的用户使用Sentry 2身份验证捆绑包登录。


你的用户表中是否有名为id的列?如果没有,那就是问题所在。 - OffTheFitz
是的,id在那里。@OffTheFitz 表名叫做 users。 - Josh
请纠正我,但您是在尝试注册已登录的用户吗?如果您正在使用Sentry注册用户,为什么要调用Auth :: user();? Auth :: user()返回当前登录的用户,因此您正在尝试注册应该已登录的用户,这没有意义。 - Altrim
2
如果您正在使用Sentry,请使用Sentry::getUser()->id检查已登录的用户。您收到的错误是Auth::user()返回NULL并尝试从NULL获取ID,因此出现错误“尝试从非对象获取属性”。 - Altrim
@Altrim 啊,我真是太傻了,这个方法很好用!请将其作为答案提交,这样我就可以投票选它为正确答案。也谢谢你,OffTheFitz。 - Josh
显示剩余2条评论
24个回答

118

现在使用 Laravel 4.2 获得用户 ID 变得很容易:

$userId = Auth::id();

但是如果您想获取用户ID以外的数据,您可以使用:

$email = Auth::user()->email;

了解更多细节,请查看文档中的安全部分


Auth::id() 在 Laravel 6.0 中正常工作。 - Pavel8289
1
不要忘记添加"use Illuminate\Support\Facades\Auth;"。 - mauronet
在 Laravel 的后续版本中,你可以简单地使用 use Auth; 来获得相同的结果。 - Jem

72
如果您正在使用 Sentry,请使用 Sentry::getUser()->id 检查已登录的用户。您收到的错误是 Auth::user() 返回 NULL,并且尝试从 NULL 获取 id,因此出现了 trying to get a property from a non-object 的错误。

3
我愿意使用方法链接{{auth()->user()->name}}。 - mercury

53

在确认登录后,请执行Auth :: check()以确保您已成功登录:

if (Auth::check())
{
    // The user is logged in...
}

3
没错 - 首先你需要使用 Auth::check() 方法检查用户是否登录。然后,Auth::getUser() 将返回一个有用的对象 :) - BlueMan
1
如果您想使用Blade模板来实现此操作:@if(Auth::check()) {{Auth::user()->id}} @endif(如果您想要获取用户的ID以供JavaScript / Ajax使用,则此方法非常有用) - Cato Minor
Laravel 6会怎么样? - gumuruh

25

id是protected的,只需在你的/models/User.php中添加一个公共方法即可。

public function getId()
{
  return $this->id;
}

所以你可以称之为

$id = Auth::user()->getId();

始终记得测试用户是否已登录...

if (Auth::check())
{
     $id = Auth::user()->getId();
}

21

在 Laravel 8.6 中,以下代码可以在控制器中使用:

$id = auth()->user()->id;

15

在 Laravel 5.6 中,我使用:

use Auth;
$user_id = Auth::user()->id;
作为其他建议
Auth::id()

看起来适用于 Laravel 5.x 的早期版本,对我没有用。


1
Auth::id() 在 Laravel 5.7 版本中运行良好。 - RN Kushwaha

11

永远不要忘记包括并尝试使用中间件身份验证:

use Illuminate\Http\Request;   

然后使用请求方法查找id:

$id= $request->user()->id;

10

检查您使用 Auth::user() 的函数所在的路由,要获取 Auth::user() 数据,该函数必须在 web 中间件中,例如:Route::group(['middleware' => 'web'], function () {});


9
您可以通过 Auth 门面访问已验证的用户:
use Illuminate\Support\Facades\Auth;

// Get the currently authenticated user...
$user = Auth::user();

// Get the currently authenticated user's ID...
$id = Auth::id();

Auth::user()->role 解决了我的问题。需要使用 use Illuminate\Support\Facades\Auth; 才能使用 Auth::user()。感谢您的答案。 - Mohamed Raza

7

如果有人正在寻找 Laravel 5 >

 Auth::id() 

提供授权用户的ID。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接