web-dev-qa-db-fra.com

Vérifier quel `gardien 'est connecté

J'ai une application multiauth laravel 5.2, avec les gardes en jachère définis sur config/auth.php:

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

Donc, admin et user.

Le problème réside dans la couche de vue, car ces deux gardes connectés partagent certaines vues, par exemple:

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

Dans ce cas, la garde est codée en dur dans la vue pour être toujours admin (cela donne une erreur lorsque la garde de connexion est user), mais, pour éviter d'avoir à faire une autre vue égale juste pour ce petit changement , Je voudrais qu'il soit dinamique, quelque chose comme:

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

PS: Je sais que cela pourrait être réalisé en obtenant le segment d'URL correspondant, par exemple: www.site.com/pt/user/dasboard qui, dans le cas, il s'agirait du segment 2, mais de cette façon, l'application perdrait son évolutivité, car à l'avenir, le segment correspondant pourrait ne plus être le même (2 dans l'exemple ci-dessus)

18
Miguel

Une façon de procéder consiste à étendre la classe d'authentification Laravel dans le conteneur IoC pour inclure, par exemple, une méthode name() qui vérifie quel garde est utilisé pour la session en cours et appelle user() sur cette instance de Guard.

Une autre façon consiste simplement à utiliser un if-statement dans votre modèle de lame:

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

Cependant, c'est un peu sale. Vous pouvez nettoyer cela un peu en utilisant un partiel, ou en passant à la vue une variable contenant le nom de la garde, soit directement à partir de votre contrôleur, soit via un ViewComposer, puis en faisant:

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

dans votre vue.

Étendre l'authentification de Laravel est votre meilleure option, imo.

31
tomfrio

Puisque Laravel 5.5, c'est facile à faire avec le @auth directive modèle.

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

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

@guest
    You're not logged in!
@endguest

Référence: https://laravel.com/docs/5.6/blade#if-statements

4
miken32