我应该如何处理或改进 Laravel 中的类似过滤器?
How should I handle or improve my similar filters in Laravel?
我有一个正在 Laravel 中构建的应用程序,这是我第二次认真使用它。该应用程序使您能够登录并访问 guests/visitors 可能无法访问的站点的某些区域。这是每个带有注册选项的网站的标准票价,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 过滤器,因为我现在正在使用它们。我还有哪些其他过滤器设置可供选择?我是否应该使用过滤器,这种逻辑在我的控制器中是否应该更好?
欢迎所有意见。
过滤器绝对是正确的选择,但您可以通过 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();
}
});
我有一个正在 Laravel 中构建的应用程序,这是我第二次认真使用它。该应用程序使您能够登录并访问 guests/visitors 可能无法访问的站点的某些区域。这是每个带有注册选项的网站的标准票价,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 过滤器,因为我现在正在使用它们。我还有哪些其他过滤器设置可供选择?我是否应该使用过滤器,这种逻辑在我的控制器中是否应该更好?
欢迎所有意见。
过滤器绝对是正确的选择,但您可以通过 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();
}
});