0
votes

La directive Laravel blade `@ auth` ne fonctionne pas comme prévu

J'essaie de choisir dynamiquement le modèle de lame maître selon le rôle de l'utilisateur actuel connecté. (ici, il devrait aller dans le bloc d'authentification du 'propriétaire')

@extends('theme::Admins.outline.layout.master')

@include('theme::Admins.shopmanager.layout.common.header')
@include('theme::Admins.shopmanager.layout.common.left-sidebar') // The error throws from inside this view.
@include('theme::Admins.shopmanager.layout.common.footer')

@section('title-head', __('Shop Manager'))

mais cela donne toujours erreur en essayant de compiler le modèle maître 'shopmanager'. Il n'entre pas dans le bloc @auth 'shopmanager' car il n'imprime rien si j'imprime à l'intérieur de ce bloc.

Cela ne fonctionne que si je commente complètement cette ligne.

P.S.:

Ceci est le fichier de modèle principal theme :: Admins.shopmanager.layout.master qui ne doit pas être chargé.

@auth('shopmanager')
@extends('theme::Admins.shopmanager.layout.master')
@endauth

@auth('shopowner')
@extends('theme::Admins.shopowner.layout.master')
@endauth

Je peux encapsuler la vérification @auth autour des lignes @include mais le point est , ce fichier complet doit être ignoré de la compilation.


4 commentaires

Je pense que vous avez une faute de frappe sur la dernière ligne. Il doit être @endauth. Peut-être avez-vous un problème avec vos gardes d'authentification? Etes-vous sûr que "shopowner" correspond à l'un des gardes configurés dans votre auth.php?


Vous avez deux rôles (1) shopmanager (2) shopowner. droit??


@wau, faute de frappe j'ai mis à jour. mais ce n'était pas le problème.


@Manisha, le rôle n'est pas un nom de colonne dans la table. J'utilise la garde de laravel.


3 Réponses :


1
votes

Essayez le code ci-dessous, j'espère que cela vous aidera:

   @if(Auth::check())
      @if(Auth::user()->role=='shopmanager')
          @extends('theme::Admins.shopmanager.layout.master')
      @else
          @extends('theme::Admins.shopowner.layout.master')
      @endif
    @endif


7 commentaires

J'avais déjà essayé la syntaxe if (Auth :: guard ('shopmanager') -> check ()) avant et toujours le même problème. essayé votre syntaxe aussi.


L'erreur provient de l'une des vues qui est incluse dans le modèle principal de 'shopmanager' que nous étendons dans le code ci-dessus. dans cette vue, la variable $ user est évidemment introuvable et c'est pourquoi nous ne voulons pas charger le wrapper de vue maître complet.


Je pense que le problème n'est pas ici, mais dans le fichier d'application principal.


J'ai également ajouté le fichier de modèle principal. mais mon point est .. pourquoi même il va à l'intérieur pour vérifier les fichiers d'inclusion?


Tout d'abord, vous vérifiez que le rôle de gestionnaire de magasin est disponible ou non? essayez ceci et vérifiez si vous obtenez ou non @if (Auth :: user () -> role == 'shopmanager') dd (Auth :: user () -> role) @endif


continuons cette discussion dans le chat .


C'est vraiment utile pour moi. Merci de votre aide.



0
votes

Si vous avez une authentification multiple cette fois-ci, essayez ci-dessous:

@if(Auth::guard('shopmanager')->user())
   @extends('')
@else
   @extends('')
@endif

Dans mon cas, je gère le responsable, le client et l'administrateur avec ce code.

  1. Manager : Auth :: guard ('manager') -> user ()
  2. Admin : Auth :: user ()
  3. Client : Auth :: guard ('client') -> utilisateur ()


2 commentaires

Cela n'a pas fonctionné pour moi. Je parie que @extend va toujours pour la compilation indépendamment de la condition. vérifier ma solution qui a fonctionné vous l'expliquera.


avez-vous déjà essayé @include (..) d'un autre modèle dans votre modèle principal (qui n'est pas connecté) et y imprimer une variable non définie. vous comprendrez le point.



2
votes

RÉSOLU

Conformément à mon apprentissage, @extend (...) sera toujours compilé quelles que soient les conditions de bouclage externe. doit donc être déplacé vers des blocs basés sur des variables dynamiques.

@auth('shopmanager')
    @php
        $masterTemplate = 'theme::Admins.shopmanager.layout.master';    
    @endphp
@endauth

@auth('shopowner')
    @php
        $masterTemplate = 'theme::Admins.shopowner.layout.master';    
    @endphp
@endauth

@extends($masterTemplate)

1 commentaires

Cela devrait être marqué comme la meilleure réponse, j'essayais de comprendre pourquoi étend ignorait mes conditions (affichant à la fois la version mobile et la version de bureau). Vous avez totalement sauvé ma journée!