Laravel管理员登录之前和之后使用过滤器的访问级别


Laravel admin login with access levels using filters before and after?

所以我必须有一个登录表面,登录后我必须决定哪个管理表面可供用户使用。

所以我为此设置了路由,在访问管理页面之前,他们需要登录,登录后会重定向到相应的管理页面:

Route::get('admin', array('before' => 'auth', 'after' => 'access_lvl'));
Route::get('admin1', array('before' => 'auth', 'as'=>"admin1", 'uses' => 'admin1@index'));
Route::get('admin2', array('before' => 'auth', 'as'=>"admin2", 'uses' => 'admin2@index'));
Route::get('admin3', array('before' => 'auth', 'as'=>"admin3", 'uses' => 'admin3@index'));

这里是access_lvl滤波器:

Route::filter('access_lvl',function(){
  $access_lvl=Auth::user()->access_lvl;
  var_dump($access_lvl);
  switch($access_lvl){
    case 1: return Redirect::to('admin1/'); break;
    case 2: return Redirect::to('admin2/'); break;
    case 3: return Redirect::to('admin3/'); break;
    default: return Redirect::to('admin3/'); break;
  };
});

不幸的是,我在chrome中的Auth::user()->access_lvl;上得到了一个非对象错误的Trying-to-get属性,而在firefox中只有一个int(1)响应,没有错误。你能帮我解决这个问题吗?我在哪里犯错误?这前后逻辑正确吗?或者我应该在其他地方添加后过滤器吗?

我想我也在使用Laravel3。我刚得到这个项目,我必须继续。

所以我有一个解决方案:

如果Auth::guest()为true,auth过滤器会将您重定向到login表面,因此它可以通过switch语句将您重定向至相应的管理页面,如下所示:

Route::filter('auth', function()
{
    if (Auth::guest()) return Redirect::to('admin/login');
    $access_lvl=Auth::user()->access_lvl;
    switch($access_lvl){
      case 1: return Redirect::to('admin1/'); break;
      case 2: return Redirect::to('admin2/'); break;
      case 3: return Redirect::to('admin3/'); break;
      default: return Redirect::to('admin3/'); break;
    };
});

这意味着你不必有一个单独的access_lvl过滤器

尽管这是一个解决方案,但我仍然有问题:

after过滤器在原始情况下有什么问题?我应该在什么时候使用after过滤器?

您应该使用Laravel中间件

这就是如何在您的路线

中避免switch() {case:}