【发布时间】: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 过滤器,因为我现在正在使用它们。我还有哪些其他过滤器设置选项可供使用?我什至应该使用过滤器,这种逻辑在我的控制器中应该更好吗?
感谢所有输入。
【问题讨论】: