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


88

提交要添加用户的表单时,出现以下错误“试图获取非对象的属性”,该错误显然出现在第一行: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 2013年

是的,id在@OffTheFitz表中被称为用户
乔什(Josh)

如果我错了,请纠正我,但您正在尝试注册一个已登录的用户?如果您使用Sentry注册用户,为什么要打电话Auth::user();?Auth :: user()返回当前登录的用户,因此您尝试注册应该登录的用户,这没有意义
Altrim

@Josh你的模特呢。什么是protectedKey?
OffTheFitz

2
好吧,如果您使用的是Sentry,请使用来检查登录用户Sentry::getUser()->id。您得到的错误是Auth::user()返回NULL,并且它尝试从NULL获取ID,因此出现错误trying to get a property from a non-object
Altrim

Answers:


61

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


2
我更喜欢使用方法链接{{auth()-> user()-> name}}
Hos Mercury

70

现在,使用laravel 4.2,可以轻松获取用户ID:

$userId = Auth::id();

就这些。

但是要检索除id以外的用户数据,可以使用:

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

有关更多详细信息,请查看文档的安全性部分


Auth :: id()是字词Laravel 6.0
Pavel8289

不要忘记添加“使用Illuminate \ Support \ Facades \ Auth;”
mauronet

46

在执行Auth :: check()之前,请确保您已正确登录:

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

3
没错-首先,如果用户是登录用户,则必须先Auth :: check()。然后Auth :: getUser()将有一个有用的对象:)
BlueMan 2014年

1
如果要使用刀片模板进行此操作:(@if(Auth::check()) {{Auth::user()->id}} @endif如果要获取javascript / ajax的用户ID,这将非常有用)
Cato Minor 2015年

如果laravel 6会怎样?
gumuruh

19

id是protected,只需在您的计算机中添加一个公共方法/models/User.php

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

所以你可以叫它

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

记得一直测试用户是否已登录...

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

11

在Laravel 5.6中,我使用

use Auth;
$user_id = Auth::user()->id;

作为另一个建议

Auth::id()

似乎适用于Laravel 5.x的旧版本,但不适用于我。


1
Auth::id()在laravel 5.7版本中工作正常。
RN库什瓦哈


8

永远不要忘记包括并尝试使用中间件auth:

use Illuminate\Http\Request;   

然后使用请求方法找到ID:

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

5

使用Illuminate \ Support \ Facades \ Auth;

在班上:

protected $user;

此代码对我有用

在构造中:

$this->user = User::find(Auth::user()->id);

In function:
$this->user->id;
$this->user->email;

等等..



5

您可以通过Auth外观访问经过身份验证的用户:

use Illuminate\Support\Facades\Auth;

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

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


2

您的问题和代码示例有点模糊,我相信其他开发人员会将重点放在错误的事情上。我在Laravel中创建一个应用程序,使用了在线教程来创建新用户和身份验证,并且似乎已经注意到,当您在Laravel中创建新用户时,不会创建Auth对象-您用来获取(new)应用程序其余部分中的已登录用户的ID。这是一个问题,我相信您可能会问。我在userController :: store中做了这种笨拙的hack:

$user->save();

Session::flash('message','Successfully created user!');

//KLUDGE!! rest of site depends on user id in auth object - need to force/create it here
Auth::attempt(array('email' => Input::get('email'), 'password' => Input::get('password')), true);

Redirect::to('users/' . Auth::user()->id);

不必创建和验证,但是我不知道该怎么办。


2

第一个支票用户登录,然后

if (Auth::check()){
    //get id of logged in user
    {{ Auth::getUser()->id}}

    //get the name of logged in user
    {{ Auth::getUser()->name }}
}


1

在Laravel 8.6中,以下内容在控制器中对我有用:

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

0

你可以试试 :

$id = \Auth::user()->id

1
虽然从技术上来说这个答案可能是正确的,但是请提供一个上下文,说明您为什么会解决此问题以及它的作用EG(使用名称空间时,全局名称空间中的任何内容都必须带有``才能表示它在全局名称空间中而不是当前的名称空间)
Barkermn01

0
 if(Auth::check() && Auth::user()->role->id == 2){ 
         $tags = Tag::latest()->get();
        return view('admin.tag.index',compact('tags'));
    }

您好,欢迎来到stackoverflow,并感谢您的回答。尽管此代码可以回答问题,但是您可以考虑对所解决的问题以及如何解决添加一些说明吗?这将有助于将来的读者更好地了解您的答案并从中学习。
Plutian

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.