2016-05-16 6 views
1

Ich versuche, eine einfache Middleware hinzuzufügen, um zu überprüfen, ob ein Benutzer mit einer Rolle übereinstimmt. Ich bin in ein Problem laufen, wenn ich die Middleware verwenden, erhalte ich eine Ausnahme:Laravel RoleMiddleware, Klassenrolle nicht gefunden

Reflection: Klassenrolle nicht

ich nicht versuchen, existiert eine Klasse namens Rolle zu nennen, so nehme ich an das passiert magisch irgendwo in Laravel.

Meine Middleware:

class RoleMiddleware 
{ 
    /** 
    * Run the request filter. 
    * 
    * @param \Illuminate\Http\Request $request 
    * @param \Closure $next 
    * @param string $role 
    * @return mixed 
    */ 
    public function handle($request, Closure $next, $role) 
    { 
     if (! $request->user()->is($role)) { 
      return redirect('/login'); 
     } 

     return $next($request); 
    } 

} 

In der Benutzer-Tabelle habe ich eine Rolle Feld und in dem Modell Benutzer ich habe:

/** 
* Check if a user is a certain role 
* 
* @param $role 
* @return bool 
*/ 
function is($role) { 
    return ($this->role == $role); 
} 

Die Route Gruppe:

Route::group(['prefix' => 'support', 'middleware' => ['role:admin', 'web']], function() { 
     Route::get('threads', '[email protected]'); 
}); 

In Http/Kernel.php:

protected $middlewareGroups = [ 
    'web' => [ 
     \App\Http\Middleware\EncryptCookies::class, 
     \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class, 
     \Illuminate\Session\Middleware\StartSession::class, 
     \Illuminate\View\Middleware\ShareErrorsFromSession::class, 
     \App\Http\Middleware\VerifyCsrfToken::class, 
    ], 

    'role' => [ 
     RoleMiddleware::class, 
    ], 
]; 

Haben Sie irgendwelche Ideen, was diese ReflectionException verursachen könnte?

+0

Try '\ App \ Http \ Middleware \ RoleMiddleware: : Klasse 'und Execute' Dump-Autoload' auch, dann sagen Sie uns, ob es funktioniert. –

+0

Der Namespace ist in Ordnung, er kann die Klasse erreichen und es wird ein Fehler über das fehlende Argument ausgelöst, wenn ich nur die Middleware-Rolle anstelle von Rolle: Admin verwende. – Devon

Antwort

3

In Http/Kernel.php müssen Sie den vollständigen Pfad zu RoleMiddleware einschließen. Z.B .:

... 
'role' => [ 
    \App\Http\Middleware\RoleMiddleware::class, 
], 
... 
+0

Es wird mit der Verwendung importiert, sodass der vollständige Namespace nicht benötigt wird. – Devon

0

Dies kam auf zwei Probleme:

  1. $ middlewareGroups erlauben kann nicht für Parameter. (Muss bestätigt werden) Das Löschen von RoleMiddleware auf $ routeMiddleware löscht die Ausnahme.

  2. Wenn Sie "web" nach "role: admin" haben, wurde eine null $ request-> user() zurückgegeben. Für zukünftige Benutzer müssen Sie möglicherweise die Platzierung Ihrer Middleware in Erwägung ziehen und überprüfen, ob $ request-> user() null ist.

Hoffe das hilft jemand anderem.

0

Versuchen, dies zu ändern

Route::group(['prefix' => 'support', 'middleware' => ['role:admin', 'web']], function() { 
    Route::get('threads', '[email protected]'); 
}); 

zu

Route::group(['prefix' => 'support', 'middlewareGroups' => ['role:admin', 'web']], function() { 
    Route::get('threads', '[email protected]'); 
}); 

ich ein Anfänger in Laravel bin ich das gleiche Problem konfrontiert war und fixierte durch den Namen von Middleware-Wechsel zu „your-Eigen- Middelware-Name ".

0

Für Spatie/Laravel-Berechtigungen richtig arbeiten wir die beiden Route-Middleware in app/Http/Kernel.php registrieren müssen wie folgt, zusammen mit den beiden Auth-Middleware:

/** 
* The application's route middleware. 
* 
* These middleware may be assigned to groups or used individually. 
* 
* @var array 
*/ 
protected $routeMiddleware = [ 
    'auth' => \Illuminate\Auth\Middleware\Authenticate::class, 
    'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class, 
    'permission' => \Spatie\Permission\Middlewares\PermissionMiddleware::class, 
    'role' => \Spatie\Permission\Middlewares\RoleMiddleware::class, 
];