Laravel 4:基于身份验证状态的单个URI的两个不同的视图页面


Laravel 4: Two different view pages for a single URI based on auth status

我最近开始使用Laravel 4进行开发,我有一个关于路由的问题。

对于"/",我希望根据用户的身份验证状态有两个不同的视图页面。

如果用户已登录并正在查看"/",我想向他们显示一个带有管理控件的视图,当用户在未登录的情况下以常规用户身份查看"/"时,我想提供一个常规信息视图。

为了实现这一点,我一直在玩过滤器"auth"answers"guest",但运气不佳。//app/routes.php

// route for logged in users
Route::get('/', array('before' => 'auth', function()
{
   return 'logged in!';
}));
// for normal users without auth
Route::get('/', function() 
{ 
    return 'not logged in!'; 
}));

上面的代码工作到这样一个地步:作为一个登录用户,我可以显示正确的响应,但在注销后,我无法作为普通用户看到正确的响应。

也许这是应该在控制器中处理的事情?如果有人能为我指明正确的方向,那将是非常有帮助的。

一个(简单)选项是使用Auth::check()函数查看他们是否登录:

Route::get('/', function() 
{
    if (Auth::check())
    {
        return 'logged in!';
    }
    else
    {
        return 'not logged in!'; 
    }  
});

如果您愿意,您可以在控制器中使用相同的逻辑。

编辑-使用过滤器

如果你想在过滤器中这样做,你可以使用这样的东西:

Route::filter('auth', function()
{
    if (Auth::guest()) 
    {
        return Redirect::to('non-admin-home');
    }
});

然后定义第二条路线(或控制器中的操作)来处理普通用户。虽然这意味着页面有一个不同的url,但我认为这不是你想要的。。

完整的基于控制器的路由流程:(保持routes.php清洁)

routes.php

Route::controller('/', 'IndexController');

IndexController.php

class IndexController extends BaseController
{
    // HOME PAGE
    public function getIndex()
    {
        if (Auth::check())
        {
            return View::make('admin.home');
        }
        else
        {
            return View::make('user.home');
        }
    }
}