我应该如何处理或改进Laravel中的类似过滤器?

时间:2015-02-03 07:37:36

标签: php laravel filter

我有一个我在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过滤器,因为我现在正在使用它们。我可以使用哪些其他过滤器设置替代品?我是否应该使用过滤器,我的控制器中这种逻辑应该更好吗?

赞赏所有输入。

1 个答案:

答案 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();
    }
});