【发布时间】:2017-05-06 02:32:50
【问题描述】:
所以我试图在登录时访问网络应用程序时验证用户的角色。我有一个users table、roles 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