2013-03-15 109 views
5

我正在为客户端构建一个相当广泛的应用程序,并且我将不得不产生某种组权限控制。我决定去Cartalyst和他们的哨兵包。
到目前为止好!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满,但我这里的问题是,我可以应用筛选器只适用于控制器的构造方法,而不是一个单一的行动。如果我在一个控制器中拥有不同访问级别的方法,该怎么办?

所以我的问题是:解决此问题的最佳方法是什么,有什么办法可以将操作筛选器应用于单个控制器方法,而不是控制器构造器。

感谢和抱歉我的英语!

+3

我建议你使用Adrenaxus建议的方法,根本不要使用Controller :: detect。即使起初它看起来很奇怪,定义每条路线或甚至每个控制器都会给你更多的自由度,而不是越野车和更高性能。顺便说一句,'Controller :: detected'完全从L4中删除。 – vFragosop 2013-03-15 12:48:32

回答

7

您可以将过滤器附加到给定的URI开始所有请求(参见official doc on filters

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

或者你可以过滤器只附加到控制器内的一些动作:

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

在附注中,您不必为每个控制器操作都创建一条路线。如果您注册您的控制器Route::controller('admin::home');它会自动启动。

另一种选择是,您只为所有角色定义一个auth过滤器,然后检查过滤器中的不同角色