Search code examples
phplaravellaravel-5laravel-bladelaravel-authentication

Checking which `guard` is loggedin


I have a multiauth laravel 5.2 app, with the fallowing guards defined on config/auth.php:

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

So, admin and user.

The problem resides in the view layer, since this two loggedin guards share some views, ex:

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

In this case the guard is hardcoded into the view to be always admin (it gives error when loggedin guard is user), but, to avoid have to do another equal view just for this little change, I would like have it dinamic, something like:

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

PS: I know that this could be achieved getting the corresponding url segment, ex: www.site.com/pt/user/dasboard which in the case it would be segment 2, but this way the app would lose scalability, since in the future the corresponding segment may not be the same (2 in the example above)


Solution

  • One way to do this is to extend the Laravel authentication class in the IoC container to include, for instance, a name() method that check which guard is used for the current session, and calls user() on that Guard instance.

    Another way is to simply use an if-statement in your Blade template:

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

    However, this is a little dirty. You can clean this up a bit by using a partial, or by passing the view a variable containing the guard name, either directly from your Controller, or via a ViewComposer, and then doing:

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

    in your View.

    Extending Laravel's authentication is your best option, imo.