So versuche ich die Rolle eines Benutzers beim Zugriff auf die Web-App beim Einloggen zu überprüfen. Ich habe eine users table
, roles table
, und ein role_users table
Aufruf zu undefinierter Methode Illuminate Database Query Builder :: hasAnyRole() Fehler auf Laravel 5.3
Benutzer Tabelle -------- | Benutzer-ID | andere wichtige Felder |
Rollen Tabelle -------- | role_id | role_desc |
role_users Tabelle --- | role_id | Benutzer-ID |
User.php Modell
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 Modell
class Role extends Model{
public function users(){
return $this->belongsToMany('App\User','role_users', 'role_id', 'user_id');
}
}
Hier ist meine Route Datei
Route::group(['middleware' => 'web'], function() {
Route::get('/{id}',[
'uses' => '[email protected]',
'as' => 'dashboard',
'middleware' => 'roles',
'roles' => ['Superadmin', 'Admin', 'Author', 'Editor']
]);
});
I CheckRole.php (bereits definiert in der Kernel-Datei)
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);
}
}
DAS PROBLEM auch diese Middleware-Datei haben,: Ich erhalte diese „Call to undefined Methode Illuminate \ Database \ Query \ Builder :: hasAnyRole() "(überprüft, ob die Route für ein Array von Rollen zugänglich ist), aber wie Sie sehen können, ist es in meinem User.php-Modell definiert.
Ich habe versucht, alle Zeilen aus der hasAnyRole function
kommentieren und einfach nur eine Zeichenfolge aussprechen, aber der Fehler bleibt bestehen.
Mit print_r($roles)
in der CheckRole.php Datei zeigt die korrekte Anordnung von Rollen in meiner Route.
Ich vermute, bin es ist wegen der id
Parameter in meiner Route. Aber ich habe wirklich keine Ahnung, wie ich das reparieren soll.
ich denke, die Fehler aus der Datei CheckRole.php passiert. Kann jemand darauf hinweisen, was ich hier falsch gemacht habe?
Als eine Randnotiz könnten Sie wirklich diese Funktion vereinfachen, indem Sie 'whereIn' verwenden:' $ this-> roles() -> whereIn ('role_desc', $ roles) -> firstOrFail() ' – Ohgodwhy