首页 > 解决方案 > 在 nul 上调用成员函数 hasRoles()

问题描述

我是 Laravel 的新手

我已经在我的应用程序中设置了权限和角色,并将它们分配给用户 - 但是当我尝试使用 hasRole 或 hasAnyRole 时,它​​对我不起作用。

这是我的中间件:

        namespace App\Http\Middleware;

        use Closure;
        use Auth;
        class AccessAdmin
        {
            /**
             * Handle an incoming request.
             *
             * @param  \Illuminate\Http\Request  $request
             * @param  \Closure  $next
             * @return mixed
             */
            public function handle($request, Closure $next)
            {
                if(Auth::user()->hasRoles('Admin')){
                    return $next($request);
                }
                return redirect('home');
            }
        }

    <?php

好榜样

命名空间应用程序;

use Illuminate\Database\Eloquent\Model;

class Role extends Model
{
    public function users(){
        return $this->belongsToMany('App\User');
    }
}
User Model
<?php

namespace App;

use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;

class User extends Authenticatable
{
    use Notifiable;

    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = [
        'name', 'email', 'password',
    ];

    /**
     * The attributes that should be hidden for arrays.
     *
     * @var array
     */
    protected $hidden = [
        'password', 'remember_token',
    ];

    /**
     * The attributes that should be cast to native types.
     *
     * @var array
     */
    protected $casts = [
        'email_verified_at' => 'datetime',
    ];
    public function roles(){
        return $this->belongsToMany('App\Role');
    }
    public function hasAnyRoles($roles){
        return null !== $this->roles()->whereIn('name',$roles)->first();
    }
    public function hasRoles($role){
        return null !== $this->roles()->where('name',$role)->first();
    }
}

产生此错误:

FatalThrowableError (E_ERROR) 在 null 上调用成员函数 hasRole()

标签: phplaravel

解决方案


如果没有登录用户则 Auth::user() 为空,请尝试以下操作

<?php 

namespace App\Http\Middleware;

use Closure;
use Auth;
class AccessAdmin
{
    /**
        * Handle an incoming request.
        *
        * @param  \Illuminate\Http\Request  $request
        * @param  \Closure  $next
        * @return mixed
        */
    public function handle($request, Closure $next)
    {
        if(!Auth::guest() && Auth::user()->hasRoles('Admin')){
            return $next($request);
        }
        return redirect('home');
    }
}

这个中间件和你原来的一样,但它会检查以确保用户首先登录。如果他们没有登录,或者他们不是管理员,它将重定向到主页。


推荐阅读