Laravel 4:基于身份验证状态的单个 URI 的两个不同视图页面
Posted
技术标签:
【中文标题】Laravel 4:基于身份验证状态的单个 URI 的两个不同视图页面【英文标题】:Laravel 4: Two different view pages for a single URI based on auth status 【发布时间】:2013-08-05 13:35:43 【问题描述】:我最近开始使用 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!';
));
上面的代码工作到一个点,作为登录用户,我能够显示正确的响应,但在注销后,我无法以普通用户的身份看到正确的响应。
也许这是应该在控制器中处理的事情?如果有人能指出我正确的方向,那将非常有帮助。
【问题讨论】:
【参考方案1】:一个(简单)选项是使用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');
【讨论】:
感谢您的意见!这是执行此操作的合乎逻辑的方式,但我不确定将 if 语句放在路由文件中是否是一种标准的做事方式。如果内置路由类无法做到这一点,我想没有任何规则反对它。 是的,我知道你的意思.. 虽然它很干净并且易于遵循逻辑。另一种方法是使用过滤器将用户重定向到另一个视图。我会用一些东西更新上面的内容。 通常的做法是在视图中执行您想要执行的操作,因为您的唯一目的是更改向用户显示的内容。在这种情况下,您不需要像上面那样进行路由。您只需从视图中应用检查。但是,如果您打算在渲染之前更改发送到视图的输出控制器逻辑,那么您需要执行上述操作。 感谢您的想法。我已经成功实现了最有意义的过滤器方法! 感谢您提供控制器示例。想要保持路由“精简”,因为它们在非平凡的应用程序中会很快变得混乱。以上是关于Laravel 4:基于身份验证状态的单个 URI 的两个不同视图页面的主要内容,如果未能解决你的问题,请参考以下文章
使用 Laravel 和 Passport 在身份验证失败时响应状态码 401?