Использование фильтров маршрутов в Laravel
Я пытаюсь использовать фильтры маршрутов в laravel, чтобы проверить, имеет ли конкретный пользователь доступ к странице:
Route::filter('check_roles', function()
{
$current_url = URI::current();
$access = 0;
$nav = Session::get('navigation');
foreach($nav as $k => $n){
if(in_array($current_url, $n)){
$access = 1;
}
}
if($access == 0){
return Redirect::to('home');
}
//problem is if the user has access to the page a blank page is returned
});
Я использую его в таком маршруте:
Route::get('admin/(:all)', array('before' => 'check_roles'));
Проблема в том, что если пользователь имеет доступ к странице, то возвращается пустая страница. Как продолжить выполнение действия контроллера по умолчанию, если у пользователя есть доступ?
1 ответ:
Заменить
Route::get()
наRoute::filter('pattern: admin/*', 'check_roles');
.Теперь каждый раз, когда запрос содержит этот шаблон, будет вызываться ваш фильтр check_roles. Я думаю, что это то, что вам сейчас нужно, а не
Route::get()
,Вы можете использовать
Route::get()
на отдельных страницах, таких как
Route::get('supersecret', array('before' => 'check_roles'), function() { return View::make('mysecret') });
Для получения дополнительной информации маршрутизация-фильтры
Обновление, чтобы отразить мое предложение по комментарию.
Вы можете создать
Admin_Controller
, который расширит вашBase_Controller
и будет иметь ваш фильтр auth в__construct()
.class Admin_Controller extends Base_Controller { public function __construct() { parent::__construct(); $this->filter('before', 'auth'); } }
Зарегистрируйте этот контоллер в своем старте.php (поиск Autoloader, где отображается ваш base_controller).
И теперь вы можете расширить свой
Admin_Controller
всякий раз, когда вы хотите защитить свою область.class Pages_Controller extends Admin_Controller { // do cool stuff }
Надеюсь, что это поможет