Mig*_*uel 19 php laravel laravel-5 laravel-blade laravel-authentication
我有一个multiauth laravel 5.2应用程序,其中定义了config/auth.php以下警告:
...
'admin' => [
'driver' => 'session',
'provider' => 'admin',
],
'user' => [
'driver' => 'session',
'provider' => 'user',
],
...
Run Code Online (Sandbox Code Playgroud)
所以,admin和user.
问题在于视图层,因为这两个登录保护共享一些视图,例如:
Hello {{Auth::guard('admin')->user()->name}}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,守卫被硬编码到视图中总是admin(当登录后卫时它会给出错误user),但是,为了避免为了这个小改变而必须做另一个相同的视图,我想让它具有动态,例如:
Hello {{Auth::guard(<LOGGEDIN GUARD>)->user()->name}}
Run Code Online (Sandbox Code Playgroud)
PS:我知道这可以通过获取相应的url段来实现,例如:www.site.com/pt/user/dasboard在这种情况下它将是段2,但是这样app会失去可伸缩性,因为将来相应的段可能不一样(2在上面的例子中)
小智 33
一种方法是在IoC容器中扩展Laravel身份验证类,以包括一个name()方法,该方法检查当前会话使用哪个保护,并调用user()该Guard实例.
另一种方法是在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
Run Code Online (Sandbox Code Playgroud)
但是,这有点脏.您可以通过使用partial或者通过直接从Controller或ViewComposer传递视图包含保护名称的变量来清理它,然后执行以下操作:
Hello {{Auth::guard($guardName)->user()->name}}
Run Code Online (Sandbox Code Playgroud)
在你的视图中.
扩展Laravel的身份验证是您的最佳选择,imo.
这将获得用于当前登录用户的警卫名称
Auth::getDefaultDriver()
Run Code Online (Sandbox Code Playgroud)
当您登录时,默认情况下它会为您提供:
'web'
Run Code Online (Sandbox Code Playgroud)
可靠地通过哪个守卫登录它会给你那个守卫名字。
这不适用于 API !!!因为默认情况下,laravel 中的 API 不使用会话。
从Laravel 5.5开始,使用@authtemplate指令很容易做到这一点。
@auth("user")
You're a user!
@endauth
@auth("admin")
You're an administrator!
@endauth
@guest
You're not logged in!
@endguest
Run Code Online (Sandbox Code Playgroud)
参考:https : //laravel.com/docs/5.6/blade#if-statements
我建议使用全局辅助函数,如
function activeGuard(){
foreach(array_keys(config('auth.guards')) as $guard){
if(auth()->guard($guard)->check()) return $guard;
}
return null;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
20210 次 |
| 最近记录: |