任何人都可以帮我解决问题吗?
我在Laravel创建了一个区域,用户可以根据自己的角色登录。
使用artisan命令创建auth,到目前为止非常简单。
然后,我开始更改数据库中表'users'的表名和主键。 完成此操作后,需要更新用户模型(由artisan命令自动生成),并让模型知道表'用户'的确切位置,以及哪一个是该表的主键。
protected $table = 'users';
protected $primaryKey = 'userID';
在此之后,一旦我进入浏览器并进行正常登录,它就不允许我访问管理仪表板,并且我得到 试图获取非属性的提示对象
这是因为一旦表格和主键像我之前所做的那样改变了,“ $ this ”就不再存在于对象上下文中。
我怎样才能让它发挥作用?
user.php的:
class User extends Authenticatable
{
(...) public function isAdmin(){
if($this->roles->Role_Type == "Admin" && $this->is_active == 1){ //this one is the line 83 where the error is
return true;
}
return false;
}
(...)
}
答案 0 :(得分:1)
此代码中有错误
$this->roles->Role_Type
" $这 - >角色"返回与该用户对应的角色,然后取得字段" Role_Type"。
在您的场景中,该用户没有附加任何角色。
所以这" $ this->角色"返回null。
所以你无法取值" Role_Type"。这会导致错误。
您必须执行以下操作
if($this->roles != null && $this->roles->Role_Type && $this->is_active == 1) {
return true;
} else {
return false;
}
注意:您的代码可以使用一个关系。
Class User extends Model
{
public function roles()
{
return $this->hasOne('App\Role');
}
}
如果您想以有效的方式使用角色和权限,请尝试使用此程序包https://github.com/romanbican/roles
答案 1 :(得分:0)
它以这种方式工作:
进入数据库并删除了表之间建立的强关系(FK),它们对开发人员来说总是很痛苦,需要更多代码才能将它们放在那里。
感谢大家的帮助,而下面是使用和运行良好的代码:
<?php
namespace App;
use Illuminate\Foundation\Auth\User as Authenticatable;
class User extends Authenticatable
{
/**
* The attributes that are mass assignable.
*
* @var array
*/
//
protected $table = 'users';
protected $primaryKey = 'userID';
protected $fillable = [
'name',
'email',
'password',
'roleID',
'photoID',
'is_active'
];
/**
* The attributes that should be hidden for arrays.
*
* @var array
*/
protected $hidden = [
'password', 'remember_token',
];
public function role(){
return $this->belongsTo('App\Role', 'roleID');
}
public function photo(){
return $this->belongsTo('App\Photo', 'photoID');
}
// public function setPasswordAttribute($password){
//
//
// if(!empty($password)){
//
//
// $this->attributes['password'] = bcrypt($password);
//
//
// }
//
//
// $this->attributes['password'] = $password;
//
//
//
//
// }
public function isAdmin(){
if($this->role->Role_Type == "Admin" && $this->is_active == 1){
return true;
}
return false;
}
public function posts(){
return $this->hasMany('App\Post');
}
public function getGravatarAttribute(){
$hash = md5(strtolower(trim($this->attributes['email']))) . "?d=mm&s=";
return "http://www.gravatar.com/avatar/$hash";
}
}