在 Laravel 5.3 上调用未定义的方法 Illuminate\Database\Query\Builder::hasAnyRole() 错误
Call to undefined method Illuminate\Database\Query\Builder::hasAnyRole() error on Laravel 5.3
所以我在登录时尝试在访问网络应用程序时验证用户的角色。我有一个 users table
、roles 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()
所以你应该确保上面显示的用户模型确实用于身份验证。
所以我在登录时尝试在访问网络应用程序时验证用户的角色。我有一个 users table
、roles 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()
所以你应该确保上面显示的用户模型确实用于身份验证。