【问题标题】:Call to undefined method Illuminate\Database\Query\Builder::hasAnyRole() error on Laravel 5.3在 Laravel 5.3 上调用未定义的方法 Illuminate\Database\Query\Builder::hasAnyRole() 错误
【发布时间】:2017-05-06 02:32:50
【问题描述】:

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

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

角色表--------|角色 ID |角色描述 |

role_users 表 ---|角色 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 文件中。谁能指出我在这里做错了什么?

【问题讨论】:

  • 附带说明,您可以通过使用 whereIn: $this->roles()->whereIn('role_desc', $roles)->firstOrFail() 真正简化该功能

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


【解决方案1】:

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

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

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

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

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

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

【讨论】:

  • 你是对的。这是因为我使用了 Laravel 的身份验证功能。我的config/auth.php 连接到Login model 而不是User model 一些调整让我完全使用身份验证功能和角色检查。谢谢!
猜你喜欢
  • 2017-11-23
  • 2017-03-31
  • 2017-02-14
  • 2017-04-07
  • 1970-01-01
  • 2018-10-03
  • 1970-01-01
  • 2016-10-22
  • 1970-01-01
相关资源
最近更新 更多