[英]Call to a member function roles() on null in Laravel
我正在開始精通Laravel。 我正在嘗試創建一個系統,超級用戶可以在其中編輯所有用戶的角色。 到現在為止進展順利。
我的前端看起來像這樣:
@section('content')
<table>
<thead>
<th>Voornaam</th>
<th>Achternaam</th>
<th>E-mail</th>
<th>User</th>
<th>Admin</th>
<th>Superuser</th>
</thead>
</table>
<tbody>
@foreach($users as $user)
<tr>
<form action="{{ route('superuser.assign') }}" method="post">
<td>{{$user->first_name}}</td>
<td>{{$user->name}}</td>
<td>{{$user->email}}</td>
<td><input type="checkbox" {{ $user->hasRole('User') ? 'checked' : '' }} name="role_user"></td>
<td><input type="checkbox" {{ $user->hasRole('Admin') ? 'checked' : '' }} name="role_admin"></td>
<td><input type="checkbox" {{ $user->hasRole('Superuser') ? 'checked' : '' }} name="role_superuser"></td>
{{ csrf_field() }}
<td><button type="submit">Assign Roles</button></td>
</form>
</tr>
@endforeach
</tbody>
@endsection
問題是,當我嘗試通過前端將角色分配給現有用戶時,它會Call to a member function roles() on null
引發錯誤“ Call to a member function roles() on null
我有一個UserController看起來像這樣:
public function postAssignRoles(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_admin'])
{
$user->roles()->attach(Role::where('name', 'Admin')->first());
}
if ($request['role_superuser'])
{
$user->roles()->attach(Role::where('name', 'Superuser')->first());
}
return redirect()->back();
}
}
我的User類包含以下內容:
public function roles()
{
return $this->belongsToMany('App\Role', 'user_role', '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 true;
}
}
return false;
}
public function hasRole($role)
{
if ($this->roles()->where('name', $role)->first())
{
return true;
}
return false;
}
}
我也在中間件中進行了設置
public function handle($request, Closure $next)
{
if ($request->user() === null)
{
return response("U bent niet bevoegd om deze actie uit te voeren.", 401);
}
$actions = $request->route()->getAction();
$roles = isset($actions['roles']) ? $actions['roles'] : null;
if ($request->user()->hasAnyRole($roles) || !$roles)
{
return $next($request);
}
return response("U bent niet bevoegd om deze actie uit te voeren.", 401);
}
並將其添加到內核中
'roles' => \App\Http\Middleware\CheckRole::class
我認為問題是由於一個原因或另一個$user = User::where('email', $request['email'])->first();
返回null。 我嘗試使用get()
而不是first()
,但是隨后得到的Method Illuminate\\Database\\Eloquent\\Collection::roles does not exist.
錯誤。
對於許多代碼片段,我感到很抱歉,但是在過去的8個小時里,我一直在為此苦苦掙扎,而且真的不知道該在哪里搜索問題了。 請有人幫助我,然后我哭着睡在房間的角落,再也不要觸摸Laravel。
沒錯,在查詢上調用first()
返回null,因此得到該錯誤的原因。
所以,你可以用什么來防止調用roles()
空對象是使用firstOrFail()
將拋出一個方法ModelNotFoundException
可以捕獲使用try
catch
塊,並優雅地處理它。
正如您所看到的,您沒有在表單中發送電子郵件的值,因此應將電子郵件置於隱藏的輸入中:
<td>
<input type="hidden" name="email" value="{{$user->email}}" />
{{$user->email}}"
</td>
沒有這就是為什么您得到null
結果的原因。
您必須檢查是否要設置要傳遞的值,可以使用isset示例@isset('$ user-> hasRole('User')');進行設置。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.