检查哪个“守卫”已登录

我有一个多身份验证的laravel 5.2应用程序,休眠卫士的定义在:config/auth.php

...
'admin' => [
    'driver' => 'session',
    'provider' => 'admin',
],
'user' => [
    'driver' => 'session',
    'provider' => 'user',
],
...

所以,和.adminuser

问题在于视图层,因为这两个登录防护者共享一些视图,例如:

Hello {{Auth::guard('admin')->user()->name}}

在这种情况下,guard被硬编码到视图中以始终存在(当login guard是)时,它会给出错误,但是,为了避免必须为这个小更改做另一个相等的视图,我希望它具有dinamic,如下所示:adminuser

Hello {{Auth::guard(<LOGGEDIN GUARD>)->user()->name}}

PS:我知道这可以实现获得相应的url段,例如:在这种情况下,它将是段2,但是这样应用程序将失去可扩展性,因为将来相应的段可能不相同(上面示例中的2)www.site.com/pt/user/dasboard


答案 1

执行此操作的一种方法是扩展 IoC 容器中的 Laravel 身份验证类,以包括一个方法,例如,该方法检查当前会话使用哪个 guard,并调用该 Guard 实例。name()user()

另一种方法是在 Blade 模板中简单地使用 if 语句

@if(Auth::guard('admin')->check())
    Hello {{Auth::guard('admin')->user()->name}}
@elseif(Auth::guard('user')->check())
    Hello {{Auth::guard('user')->user()->name}}
@endif

但是,这有点脏。您可以通过使用部分或直接从控制器或通过ViewComposer向视图传递包含保护名称的变量来稍微清理一下,然后执行以下操作:

Hello {{Auth::guard($guardName)->user()->name}}

在您的视图中。

扩展Laravel的身份验证是您最好的选择,imo。


答案 2

从Laravel 5.5开始,这很容易用模板指令来完成。@auth

@auth("user")
    You're a user!
@endauth

@auth("admin")
    You're an administrator!
@endauth

@guest
    You're not logged in!
@endguest

参考资料: https://laravel.com/docs/5.6/blade#if-statements


推荐