【问题标题】:Using route filters in Laravel在 Laravel 中使用路由过滤器
【发布时间】:2012-11-19 10:10:05
【问题描述】:

我正在尝试在 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'));

问题是如果用户有权访问该页面,则会返回一个空白页面。如果用户有权访问,我如何继续使用默认控制器操作?

【问题讨论】:

    标签: php laravel laravel-3


    【解决方案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') });

    欲了解更多信息Routing - Filters

    更新以反映我对评论的建议。

    您可以创建一个 Admin_Controller 来扩展您的 Base_Controller 并将您的身份验证过滤器放在 __construct() 中。

    class Admin_Controller extends Base_Controller {
        public function __construct()
        {
            parent::__construct();
            $this->filter('before', 'auth');
        }
    }
    

    在您的 start.php 中注册此控制器(搜索 Autoloader,您的 base_controller 已映射到该位置)。

    您现在可以在想要保护您的区域时扩展您的Admin_Controller

    class Pages_Controller extends Admin_Controller {
        // do cool stuff
     }
    

    希望有帮助

    【讨论】:

    • 我正在使用 auth 过滤器进行 route::filter。当我尝试做这样的事情时: Route::filter('pattern: admin/*', 'auth|check_roles');它只执行第一个。
    • 我认为这里的问题可能是 laravel 没有执行我在控制器中拥有的方法,所以它什么都不做。我已经使用 Route::controller(Controller::detect());为每个控制器创建一个路由,但它似乎没有生效。
    • 多个过滤器可以附加到 REST 路由中,我认为您不能创建使用多个过滤器的过滤器。您可能需要创建一个新的控制器并将您的控制器附加到您的身份验证过滤器。然后在您需要用户提供密码以访问应用程序的该部分时扩展该控制器
    • Route::controller(Controller::detect()) 据报道它搞砸了路由,我建议你手动添加你需要路由的控制器,Route::controller(array('admin', 'members', pages', 'and_so_on'));
    • 谢谢!我刚刚在控制器上包含了使用Route::filter('admin/*', 'check_roles')auth 过滤器的check_roles 过滤器。
    猜你喜欢
    • 1970-01-01
    • 2014-10-26
    • 1970-01-01
    • 1970-01-01
    • 2014-07-17
    • 2014-12-14
    • 2015-08-30
    • 2018-10-27
    • 2013-11-12
    相关资源
    最近更新 更多