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

Kev*_*ung 4 php laravel laravel-4 laravel-routing

我最近开始使用Laravel 4进行开发,我对路线有疑问.

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

如果用户登录并正在查看"/",我想向他们展示一个带有管理控件的视图,当用户在没有登录的情况下以普通用户身份查看"/"时,我想提供一般信息视图.

为了实现这一点,我一直在玩过滤器'auth'和'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!'; 
}));
Run Code Online (Sandbox Code Playgroud)

上面的代码工作到一个点,作为登录用户,我能够显示正确的响应,但在注销后,我无法看到作为普通用户的正确响应.

也许这是应该在控制器中处理的东西?如果有人能指出我正确的方向,那将是非常有帮助的.

mst*_*rdy 14

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

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

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

编辑 - 使用过滤器

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

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

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

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

routes.php文件

Route::controller('/', 'IndexController');
Run Code Online (Sandbox Code Playgroud)

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');
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 感谢您提供控制器示例.想要保持路线"瘦",因为它们在非平凡的应用程序中变得非常混乱. (3认同)
  • 通常的做法是在视图中执行您想要执行的操作,因为您的唯一目的是更改显示给用户的内容.在这种情况下,您无需像上面那样进行路由.您只需在视图中应用检查.但是,如果您打算在呈现之前更改发送到视图的输出控制器逻辑,那么您需要执行上述操作. (2认同)