Использование фильтров маршрутов в 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 6

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
 }

Надеюсь, что это поможет