重定向角色时非对象的角色

时间:2019-02-28 04:29:05

标签: php laravel

我尝试登录多个角色, 当用户为 admin 时,重定向到管理页面, 当用户来宾时,重定向到访客页面,

这是我的控制器,

public function postLogin()
{
    if(Auth::user()->role == 'admin'){
        echo "admin";
    }
   echo "guest";
}

但是这样的错误:

Trying to get property 'role' of non-object,
表用户中的

是其角色字段;

怎么了?

3 个答案:

答案 0 :(得分:0)

请先与特定模型创建关系。

用户模型代码:

public function userRole() {

    return $this->hasMany(User_Role_Table::class, 'user_Id')->join('roles_table', 'roles_table.id', '=', 'user_roles.role_Id')->select('roles_table.*', 'user_roles.user_Id');
}

您可以将角色称为:

Auth::user()->userRole;

答案 1 :(得分:0)

此错误试图获取非对象的属性“角色” 表示该属性角色正在尝试访问非对象。这意味着 Auth :: user()不是对象。

这在来宾角色的情况下发生。如果您已登录,则会设置 Auth :: user()并将其用作对象。但是,如果您没有登录并且正在访问页面而没有登录,那么 Auth :: user()中将没有数据。

解决此问题的方法是,与 admin 检查一起检查对象是否存在。像这样的东西-

public function postLogin()
{
    if(isset(Auth::user()->role) && Auth::user()->role == 'admin') {
        echo "admin";
    }
    echo "guest";
}

此代码的首选版本-

public function postLogin()
    {
        if(isset(auth()->user()->role) && auth()->user()->role == 'admin') {
            echo "admin";
        }
        echo "guest";
    }

您可以看到我将 Auth :: user()替换为 auth()-> user()。我发现它比使用外墙更好,但取决于您。只是我这边的小费。

答案 2 :(得分:0)

Auth::user()将返回已登录用户的实例,但是,如果用户未登录,则将返回null

如果您确定您的用户将始终拥有role属性,则可以使用check()方法:

if (Auth::check() && Auth::user()->role == 'admin') {
    echo 'admin';
}

这将首先检查是否有当前登录的用户,并且在进入下一个条件之前是否没有失败。


或者,如果您使用的是Laravel 5.5+,则可以使用optional()辅助函数

if (optional(Auth::user())->role == 'admin') {
    echo 'admin';
}
  

可选函数接受任何参数,并允许您访问该对象的属性或调用方法。如果给定的对象为null,则属性和方法将返回null而不引起错误:

相关问题