我在Laravel中制作用户角色函数,一切都工作得很好,从哪里我都有错误:调用成员函数roles()或null。
这是我的html从我发送请求:
<td><input type="checkbox" {{ $user->hasRole('User') ? 'checked' : '' }} name="role_user"></td>
<td><input type="checkbox" {{ $user->hasRole('Author') ? 'checked' : '' }} name="role_author"></td>
<td><input type="checkbox" {{ $user->hasRole('Admin') ? 'checked' : '' }} name="role_admin"></td>
然后是我在模型用户和模型角色之间建立关系的函数,以及我检查角色的函数:
public function roles(){
return $this->belongsToMany('App'Role','role_user','user_id','role_id');
}
public function hasAnyRole($roles){
if(is_array($roles)){
foreach ($roles as $role){
if($this->hasRole($role)){
return true;
}
}
}else{
if($this->hasRole($roles)){
return false;
}
}
return false;
}
public function hasRole($role){
if($this->roles->where('name',$role)->first()){
return true;
}
return false;
}
最后我传递新角色的函数:
public function postAdminAssignRoles(Request $request)
{
$user = User::where('email', $request['email'])->first();
$user->roles()->detach();
if ($request['role_user']) {
$user->roles()->attach(Role::where('name', 'User')->first());
}
if ($request['role_author']) {
$user->roles()->attach(Role::where('name', 'Author')->first());
}
if ($request['role_admin']) {
$user->roles()->attach(Role::where('name', 'Admin')->first());
}
return redirect()->back();
}
我不知道为什么这是不工作了,因为一切都很好,直到现在。什么好主意吗?
我猜postAdminAssignRoles
方法出现错误。
可能用户的电子邮件在数据库中不存在,因此调用first()
方法返回null。
您可能想要使用firstOrFail()
来清楚地看到电子邮件是无效的。或者在用first()
添加if (! $user) { ... }
抓取模型并做任何事情后,如重定向,以防您不想显示错误。