我尝试登录多个角色, 当用户为 admin 时,重定向到管理页面, 当用户来宾时,重定向到访客页面,
这是我的控制器,
public function postLogin()
{
if(Auth::user()->role == 'admin'){
echo "admin";
}
echo "guest";
}
但是这样的错误:
Trying to get property 'role' of non-object,
表用户中的是其角色字段;
怎么了?
答案 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而不引起错误: