我有一个我在Laravel建立的应用程序,这是我第二次认真使用它。该应用程序使您能够登录和访问访客/访客可能无法访问的站点的某些区域。这是每个具有注册选项的网站的标准价格,Laravel默认提供一些标准方法来处理它们已经制作的过滤器:
// LARAVEL DEFAULT FILTER
Route::filter('auth', function()
{
if (Auth::guest())
{
if (Request::ajax())
{
return Response::make('Unauthorized', 401);
}
else
{
return Redirect::guest('login');
}
}
});
我的应用程序更进了一步,并提供了用户可以拥有的各种权限(您也可以将它们称为级别或角色)。类似的,但比复杂的Stack Overflow复杂得多。我填补了一个代表这些级别的枚举,更高的数字提供了更多访问其他可能没有的区域:
abstract class UserRole {
const Unauthenticated = 1;
const Member = 2;
const Subscriber = 3;
const CharterSubscriber = 4;
const Moderator = 5;
const Administrator = 6;
}
因此,我发现自己设置的过滤器彼此非常相似,我觉得我因此而违反DRY。过滤器会检查您是否具有访问某些页面所需的权限,如下所示:
Route::filter('mustBeMemberOrGreater', function() {
if (Auth::guest() || Auth::user()->role_id < UserRole::Member) {
return Redirect::home();
}
});
Route::filter('mustBeSubscriberOrGreater', function() {
if (Auth::guest() || Auth::user()->role_id < UserRole::Subscriber) {
return Redirect::home();
}
});
Route::filter('mustBeModeratorOrGreater', function() {
if (Auth::guest() || Auth::user()->role_id < UserRole::Moderator) {
return Redirect::home();
}
});
// etc, etc
正如您所看到的,他们彼此非常相似。 无论如何我可以将这个功能包装成更少重复的东西吗?我所知道的是Laravel过滤器,因为我现在正在使用它们。我可以使用哪些其他过滤器设置替代品?我是否应该使用过滤器,我的控制器中这种逻辑应该更好吗?
赞赏所有输入。
答案 0 :(得分:2)
过滤器绝对是正确的选择,但您可以通过passing parameters使它们更具动态性。像这样:
Route::group(array('before' => 'role:Member'), function(){
// routes...
});
以下是设置该过滤器的方法:
Route::filter('role', function($route, $request, $value){
$role = constant('UserRole::'.$value);
if (Auth::guest() || Auth::user()->role_id < $role) {
return Redirect::home();
}
});