2013-03-15 12 views
5

Buduję dość obszerną aplikację dla klienta i będę musiał stworzyć pewien rodzaj kontroli uprawnień grupowych. Postanowiłem pójść z Cartalyst i ich pakietem Sentry.
Jak dotąd tak dobrze!Filtr akcji dla każdej metody w kontrolerze Laravel

Teraz mam problem, jaki jest najlepszy sposób na wykrycie uprawnień grupy użytkowników, ponieważ istnieje więcej niż jeden, więc nie mogę po prostu użyć jednego filtra i zrobić z nim.

Na przykład, chciałbym zrobić coś takiego:

przypadku stron, które wymagają dostępu na poziomie administratora

Route::group(array('before' => 'is_admin'), function() 
{ 
     Route::get('admin', array('as'=>'admin', 'uses'=>'[email protected]')); 
     // Other methods that require admin-level access 
}); 

dla stron, które potrzebują dostępu moretaor poziomu i tak dalej ..

Route::group(array('before' => 'is_moderator'), function() 

    { 
      Route::get('orodja/plosca', array('as'=>'moderator', 'uses'=>'[email protected]')); 
      // Other methods that require moderator-level access 
    }); 

Problem, który mam z tym podejściem polega na tym, że musiałbym zdefiniować nową trasę dla każdego działania kontrolera i to naprawdę nie wygląda na najlepszą praktykę Dla mnie.

Następnie pomyślałem o zarejestrowaniu wszystkich kontrolerów za pomocą Controller::detect() i sprawiłam, że są one REST-pełne, ale tutaj problem polega na tym, że mogę zastosować filtr tylko do metody konstruktora kontrolera, a nie do pojedynczej akcji. Co się stanie, jeśli mam metodę z innym poziomem dostępu w jednym kontrolerze?

Moje pytanie brzmi: Jaki jest najlepszy sposób obejścia tego problemu i czy istnieje sposób zastosowania filtru akcji do pojedynczej metody kontrolera, a nie do konstruktora kontrolera.

Dzięki i przepraszam za mój angielski!

+3

Polecam stosowanie podejścia sugerowanego przez Adrenaxus, w ogóle nie używaj 'Controller :: detect'. Nawet jeśli początkowo wygląda dziwnie, definiowanie każdej trasy lub nawet każdy kontroler daje większą swobodę, jest mniej powikłany i bardziej wydajny. Btw, 'Controller :: detected' został całkowicie usunięty z L4. – vFragosop

Odpowiedz

7

można podłączyć filtr do wszystkich żądań, które zaczynają z danym URI (patrz official doc on filters)

Route::filter('pattern: admin/*', 'auth'); 

Albo można dołączyć filtr tylko do pewnych działań w kontrolerze:

$this->filter('before', 'auth')->only(array('index', 'list')); 

Na marginesie, nie musisz tworzyć trasy dla każdej akcji kontrolera, którą posiadasz. Jeśli zarejestrujesz swój kontroler pod numerem Route::controller('admin::home');, uruchomi się on automatycznie.

Inną opcją jest zdefiniowanie tylko jednego filtru auth dla wszystkich ról, a następnie sprawdzenie różnych ról w obrębie filtru.

Powiązane problemy