【问题标题】:How should I handle or improve my similar filters in Laravel?我应该如何处理或改进我在 Laravel 中的类似过滤器?
【发布时间】:2015-02-03 07:37:36
【问题描述】:

我有一个正在 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 过滤器,因为我现在正在使用它们。我还有哪些其他过滤器设置选项可供使用?我什至应该使用过滤器,这种逻辑在我的控制器中应该更好吗?

感谢所有输入。

【问题讨论】:

    标签: php laravel filter


    【解决方案1】:

    过滤器绝对是正确的选择,但您可以通过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();
        }
    });
    

    【讨论】:

    • 太棒了。谢谢!有什么方法可以使用 -&gt;before() 语法吗?还是就像-&gt;before('role:Member');一样?
    • 是的,完全一样。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-05
    • 2022-05-22
    • 1970-01-01
    相关资源
    最近更新 更多