2014-01-28 7 views
0

У меня есть куча сгруппированных контроллеров ресурсов в моем Laravel 4 приложения, как это:Как фильтровать сгруппированные маршруты в laravel на основе запрошенного действия контроллера?

Route::group(array('before'=>'auth'), function() { 
    Route::resource('groups', 'GroupController'); 
    Route::resource('users', 'UserController'); 
}); 

Две упомянутых выше, являются контроллерами для управления пользователями и группами, реализованных с помощью Cartalysts Sentry 2 пакета.

Теперь я хочу фильтр, который проверяет текущий пользователь Sentry на разрешение вызвать действие контроллера. Так как фильтры обернуты вокруг группы маршрутов, я не могу знать, к какому контроллеру или действию относится закрытый маршрут. Насколько я знаю, не имеет значения, установлены ли фильтры в filters.php или в методе BaseController beforeFilter(), поскольку проблема в том, что я все равно не знаю, как определить, к чему в конечном итоге ведет маршрут.

Возможно ли определить действие контроллера, которое будет вызываться в (базовом) контроллере beforeFilter()?

ответ

1

Я нашел способ getActionName() в Route классе Laravel который возвращает действие, которое должно быть выполнено (в виде [email protected], так же, как маршрут контроллера). Поэтому я помещаю его в фильтр, где он проверяется на разрешения пользователя Sentry. Если пользователь не имеет доступа к нему, он отобразит представление ошибки.

routes.php (добавлена ​​perm фильтр к сгруппированным Rotes):

Route::group(array('before'=>'auth|perm'), function() { 

filters.php:

Route::filter('perm', function($route, $request) { 
    $user = Sentry::getUser(); 

    if ($user) 
    { 
     if ($user->hasAccess($route->getActionName()) == false) 
     { 
      return Response::view('errors.forbidden', array(), 403); 
     } 
    } 
});