簡體   English   中英

在Laravel中調用成員函數Role()上的null

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM