Besoin d'aide ?

L'ordre des Middleware

  • Avatar de Robthan
    Membre depuis :
    21/02/2016
    Messages :
    24

    Bonjour,
    Je suis actuellement entrain d'essayer de mettre en place une condition d'accès spécifique pour certaines pages. En clair, les administrateurs vont pouvoir ouvrir ou fermer l'accès à un espace de candidature. Pour ce faire, dans le dashboard ils ont un formulaire qui met à jour la table "status" en mettant une valeur Y (pour oui) ou N (pour non) à une colonne "candidatures".

    J'ai donc créé un middleware 'open.candidatures' avec ceci à l'intérieur :

    public function handle($request, Closure $next)
    {

    $status = Status::where('category_name', 'Candidatures')->first();

    // id 4 = administateur, ils peuvent accéder aux pages même si les candidatures sont fermées.
    if($status == 'N' && Auth::user()->role->id != 4){
    return redirect('/')->with('error', 'Vous ne pouvez pas accéder à cette page');
    }
    return $next($request);
    }

    Néanmoins, j'ai besoin que si l'espace de candidature est ouvert, pour y accéder, l'utilisateur doit être connecté. J'avais donc ajouté le $this->middleware('auth'); dans le constructeur.
    Le truc, c'est qu'en ajoutant aussi le middleware open.candidatures, si l'utilisateur veut accéder aux candidatures, le formulaire de connexion apparaît bien mais même si il n'a pas le bon rang et que les candidatures sont fermées, il est quand même redirrigé sur la bonne page et non sur l'index.

    Est-ce qu'il y a un moyen de profiter du middleware Auth avec un autre middleware ?
    Merci d'avance,

  • Avatar de bestmomo
    Membre depuis :
    07/04/2013
    Messages :
    1184

    Salut,

    C'est un peu bizarre comme résultat... le fait d'avoir le middleware auth ne devrait pas exonérer du second middleware une fois l'authentification effectuée.

  • Avatar de Robthan
    Membre depuis :
    21/02/2016
    Messages :
    24

    Hello !
    En effet, le problème s'est resolu lorsque j'ai remarqué que ma condition était simplement fausse 😅

    $status = Status::where('category_name', 'Candidatures')->first();
    if($status == 'N' && Auth::user()->role->id != 4) { ... }

    J'ai simplement remplacé $status par $status->statut...

    Autre question un peu plus complexe...
    Afin de découvrir un peu plus Laravel je réalise une sorte de forum.
    J'ai donc 3 tables :

    • Une table forum_categories (id, name)
    • Une table forum_topics (id, name, first_message, category_id, user_id)
    • Une table forum_replies (id, message, user_id, topic_id)

    Les relations sont faites, l'envoi d'une réponse, création d'un topic et récupération aussi, etc.
    J'ai donc une vue forum.index qui récupère tout les topics avec une pagination (15 par page).
    J'ai aussi une navigation qui permet d'aller de catégories en catégories en affichant les topics associés toujours avec une pagination (15 par page).

    Ce que j'aimerais bien, c'est classer les topics dans forum.index et dans la vue des catégories spécifiques par created_at de la dernière réponse postée afin que les topics avec le plus d'activité restent au dessus de la liste et s'affichent en premier. (en faite, c'est semblable à ce forum du coup )

    C'est là où je bloque car je ne sais pas vraiment comment m'y prendre. J'ai été voir un peu sur le net pour trouver la méthode join mais je ne sais pas trop comment l'adapter pour la récupération de chaque topics dans l'index et pour récupérer les topics d'une catégorie spécifique.

    Je ne sais pas si j'ai bien été clair.
    Merci en tout cas pour votre aide

  • Avatar de bestmomo
    Membre depuis :
    07/04/2013
    Messages :
    1184

    Bonsoir,

    Ca devrait fonctionner avec quelque chose comme ça :

    $category_id = 1;
    $topics = DB::table('forum_topics')
    ->selectRaw('forum_topics.*, max(forum_replies.created_at) as latest')
    ->where('category_id', $category_id)
    ->join('forum_replies', 'forum_topics.id', '=', 'forum_replies.topic_id')
    ->groupBy('forum_topics.id')
    ->latest('latest')
    ->get();
  • Avatar de Robthan
    Membre depuis :
    21/02/2016
    Messages :
    24

    Bonjour,
    C'est superbe, cela fonctionne bel et bien et je peux effectivement supprimer le where pour récupérer chaque topic. Néanmoins, comment faire pour récupérer aussi les topics sans réponses ? J'ai essayé en faisant un topics::all(); et en utilisant diff() entre les 2 collections mais on me renvoie une erreur :

    Call to undefined method stdClass::getKey()

    Aussi, est-il possible de récupérer les relations ? (user et category).
    Merci encore,

  • Avatar de bestmomo
    Membre depuis :
    07/04/2013
    Messages :
    1184

    Bonjour,

    Pour récupérer aussi les topics sans réponses il suffit de remplacer join par leftjoin.

    Pour les relations c'est plus délicat parce qu'on utilise là le query builder avec une jointure, il faut donc rester avec lui et ajouter des jointures pour les autres tables.

  • Avatar de Robthan
    Membre depuis :
    21/02/2016
    Messages :
    24

    Très bien, merci à toi. J'ai plus qu'à prendre un peu d'infos sur les jointures pour savoir comment récupérer les bonnes données.

Vous ne pouvez pas répondre à ce sujet.