在 Laravel 5.3 上调用未定义的方法 Illuminate\Database\Query\Builder::hasAnyRole() 错误

Call to undefined method Illuminate\Database\Query\Builder::hasAnyRole() error on Laravel 5.3

所以我在登录时尝试在访问网络应用程序时验证用户的角色。我有一个 users tableroles table 和一个 role_users table

用户table--------| user_id |其他重要领域 |

角色table--------| role_id | role_desc |

role_userstable---| role_id | user_id |


User.php 型号

class User extends Model implements Authenticatable{

    use \Illuminate\Auth\Authenticatable;

    public function roles(){
        return $this->belongsToMany('App\Role', 'role_users', '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('role_desc', $role)->first()) {
            return true;
        }
        return false;
    }
}

Role.php 型号

class Role extends Model{

    public function users(){
        return $this->belongsToMany('App\User','role_users', 'role_id', 'user_id');
    }
}

这是我的路线文件

Route::group(['middleware' => 'web'], function () {
    Route::get('/{id}',[
        'uses' => 'MainController@dashboard',
        'as' => 'dashboard',
        'middleware' => 'roles',
        'roles' => ['Superadmin', 'Admin', 'Author', 'Editor']
    ]);
});

我也有这个中间件文件,CheckRole.php(已经定义在内核文件中)

class CheckRole
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        if ($request->user() === null) {
            return response("Insufficient permissions", 401);
        }

        $actions = $request->route()->getAction();
        $roles = isset($actions['roles']) ? $actions['roles'] : null;

        if ($request->user()->hasAnyRole($roles) || !$roles) {
            return $next($request);
        }
        return response("Insufficient permissions", 401);
    }
}

问题: 我得到这个 "Call to undefined method Illuminate\Database\Query\Builder::hasAnyRole()"(它检查一组角色是否可以访问路由)但是正如你所看到的,它是在我的 User.php 模型中定义。

我已经尝试注释 hasAnyRole function 中的所有行,只是简单地回显一个字符串,但错误仍然存​​在。

在 CheckRole.php 文件中使用 print_r($roles) 会在我的路线中显示正确的角色数组。

我猜这是因为我的路线中的 id 参数。但我真的不知道如何解决这个问题。

我认为错误发生在 CheckRole.php 文件中。谁能指出我在这里做错了什么?

我认为它可能失败的唯一原因是当您使用其他模型进行身份验证时,而不是您之前显示的 User 模型。

如果在 config/auth.php 中,我将模型设置为该模型的副本:

'providers' => [
    'users' => [
        'driver' => 'eloquent',
        'model' => App\Models\User2::class,
    ],
],

没有 hasAnyRole 方法我遇到了完全相同的错误:

Call to undefined method Illuminate\Database\Query\Builder::hasAnyRole()

所以你应该确保上面显示的用户模型确实用于身份验证。