2013-03-15 2 views
5

Я создаю довольно обширное приложение для клиента, и мне нужно будет создать какой-то контроль над групповыми разрешениями. Я решил пойти с Cartalyst и их Sentry.
Пока все хорошо!Фильтр действий для каждого метода в контроллере Laravel

Теперь проблема, с которой я столкнулась, - это лучший способ обнаружения разрешения группы пользователей, поскольку их больше, чем один, поэтому я не могу просто использовать один фильтр и делать с ним.

Например, я хотел бы сделать что-то вроде этого:

Для страниц, которые требуется доступ уровня администратора

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

Для страниц, которым необходим доступ moretaor уровня и так далее ..

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

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

Проблема, с которой я сталкиваюсь, заключается в том, что мне нужно будет определить новый маршрут для каждого действия контроллера, и это действительно не похоже на лучшую практику мне.

Далее я подумал о регистрации всех контроллеров с помощью Controller::detect() и сделать их REST-full, но я здесь проблема, что я могу применить фильтр только к методу конструктора контроллера, а не к одному действию. Что делать, если у меня есть метод с разным уровнем доступа в одном контроллере ..?

Так что мой вопрос: Каков наилучший способ обойти эту проблему и есть ли способ применить фильтр действий к одному методу контроллера, а не к конструктору контроллера.

Спасибо и извините за мой английский!

+3

Я бы рекомендовал вам использовать подход, предложенный Adrenaxus, вообще не использовать 'Controller :: detect'. Даже сначала это выглядит странно, определение каждого маршрута или даже каждого контроллера дает вам больше свободы, менее багги и более результативны. Btw, 'Controller :: detected' был полностью удален из L4. – vFragosop

ответ

7

Вы можете прикрепить фильтр на все запросы, которые начинаются с данного URI (см official doc on filters)

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

Или вы можете прикрепить фильтр только к некоторым действиям внутри контроллера:

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

На боковой ноте вам не нужно создавать маршрут для каждого действия вашего контроллера. Если вы зарегистрируете свой контроллер с помощью Route::controller('admin::home');, он автоматически сработает.

Другой вариант заключается в том, что вы определяете только один фильтр auth для всех ролей, а затем проверяете разные роли в пределах фильтра.

Смежные вопросы