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

时间:2016-12-20 19:19:31

标签: laravel laravel-5 eloquent laravel-5.3 laravel-routing

因此,我在登录时尝试验证用户访问网络应用时的角色。我有users tableroles tablerole_users table

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

角色表-------- | role_id | role_desc |

role_users表--- | 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);
    }
}

问题:我收到这个“调用未定义的方法Illuminate \ Database \ Query \ Builder :: hasAnyRole()”(它检查路由是否可以访问角色数组)但正如您所看到的,它是在我的User.php模型中定义的。

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

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

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

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

1 个答案:

答案 0 :(得分:0)

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

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

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

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

  

调用未定义的方法Illuminate \ Database \ Query \ Builder :: hasAnyRole()

因此,您应该确保上面显示的用户模型真正用于身份验证。