IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Symfony PHP Discussion :

Modifier un tableau car optimisé


Sujet :

Symfony PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Webmaster
    Inscrit en
    Juillet 2015
    Messages
    518
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Juillet 2015
    Messages : 518
    Par défaut Modifier un tableau car optimisé
    Bonjour,

    J'ai un tableau mais je souhaite le modifier car pas optimisé.

    Ce que je souhaite avoir en sortie :
    Un tableau avec comme clé l'id du membre et comme valeur le nombre de message non lu. Plus logique que la photo ci-dessous non ?

    voici le tableau actuel en photo
    Nom : msg.png
Affichages : 148
Taille : 23,6 Ko

    Voici mon repository :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
        /**
         * Récupère le nombre de messages non lus pour chaque conversation
         * 
         * @param integer $userId
         */
        public function unreadCount(int $userId)
        {
            return $this->createQueryBuilder("message")
                ->select("author.id, count(message.id) as nb")
                ->join("message.author", "author")
                ->andWhere("message.recipient = :recipient")->setParameter("recipient", $userId)
                ->andWhere("message.readAt is NULL")
                ->groupBy("author.id")
                ->getQuery()->execute(null, Query::HYDRATE_ARRAY);
        }
    Voici mon controller :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
        /**
         * @Route("/inbox", name="inbox")
         * 
         * @IsGranted("ROLE_USER")
         */
        public function index(UserRepository $userRepository): Response
        {
            return $this->render('message/index.html.twig', [
                'users' => $userRepository->findAll(),
                'unread' => $this->repository->unreadCount($this->getUser()->getId())
            ]);
        }
    et Voici la vue :
    Code twig : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
     
    {{ dump(unread) }}
     
                {% for user in users %}
                {% if app.user.id != user.id %}
                <tr>
                    <td>{{ user.id }}</td>
                    <td>{{ user.firstName }}</td>
     
                    <td>
                        {% for arr in unread %}
                        {% if arr["id"] == user.id %}
                        {{ arr["nb"] }}
                        {% endif %}
                        {% endfor %}
                    </td>
     
                    <td>
                        <a href="{{ path('messages_show', {'id': user.id}) }}">Ecrire à ce membre</a>
                    </td>
                </tr>
                {% endif %}
                {% else %}
                <tr>
                    <td colspan="4">no records found</td>
                </tr>
                {% endfor %}

    J'ai diminué le code au maximum afin de ne pas faire un trop long post sur le forum.

    Je vous remercie

  2. #2
    Membre Expert
    Avatar de Alexandre T
    Homme Profil pro
    Ingénieur DevOps
    Inscrit en
    Mai 2002
    Messages
    1 214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur DevOps
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 214
    Par défaut
    Salut,

    Je n'ai peut-être pas compris tout ton modèle et mes conseils ne sont peut-être pas applicables. Bref, ne te fâche pas si je tombe à côté de la plaque

    1-Je te conseille de récupérer l'objet auteur par hydration :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    
        public function unreadCount(int $userId)
        {
            return $this->createQueryBuilder("message")
                ->select("author, count(message.id) as nb")
                ->join("message.author", "author")
                ->andWhere("message.recipient = :recipient")->setParameter("recipient", $userId)
                ->andWhere("message.readAt is NULL")
                ->groupBy("author") 
                ->getQuery()
                ->getResult(AbstractQuery::HYDRATE_OBJECT);
        }
    Tu vas obtenir un tableau de sous-tableau. La première clé du sous-tableau sera 0 et il y sera associé l'objet author, la seconde clé sera 1 ou nb (je ne me souviens plus) et y sera associé le nombre de messages.
    Du coup, tu n'auras pas besoin de chercher à associer la clé de l'auteur à la valeur en cours dans ta vue.

    2- Je te conseille de remplacer le test ci-dessous dans ta vue par une clause supplémentaire au prédicat dans ta requête SQL:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    {% if app.user.id != user.id %}
    Si j'ai bien compris, tu veux éviter ceux dont l'auteur est l'utilisateur en cours, donc il suffit d'ajouter une clause supplémentaire au prédicat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ->andWhere("author.id <> :recipient")
    Alexandre Tranchant
    Ingénieur DevOps pour le Ministère de l'Écologie
    Retrouvez mes articles sur PHP et Symfony

  3. #3
    Membre éclairé
    Homme Profil pro
    Webmaster
    Inscrit en
    Juillet 2015
    Messages
    518
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Juillet 2015
    Messages : 518
    Par défaut
    je suis très très fâché hihi déjà merci infiniment de prendre le temps, c'est déjà super cool! Je n'ai pas un niveau suffisant parfois mais j'apprends

    pour éviter de longue explications : j'essaie de réaliser un tuto laravel mais en Symfony.

    Alors, j'ai déjà réussi mais je doute très fortement de mon code (bien qu'il fonctionne..) ! et j'aimerais bien trouver quelqu'un pour "analyser" le code, sans pour autant écrire a ma place bien sur mais au moins me dire si c'est bien ou pas bien.. quelles sont les choses a revoir etc.. je suis a cheval sur les bonnes pratiques, je déteste avoir un code qui fonctionne mais en même temps dégueulasse !

    en gros il y a 4 fichiers :
    le repo,
    le controller,
    les deux vues,
    -index (liste des membres avec a coté le nombre de message non lu DE l'utilisateur connecté)
    -show pour l'affichage de la conversation et le form avec un seul champ pour l'envoi d'un nouveau message.

    Pour l'entité rien de spécial a redire, c'est de la génération make..

    J'ai pensé a voir sur codeur mais j'ai 80% de chance de tomber sur un charlatan qui va me dire il y a ceci ou cela sans pour autant que ce soit vrai, histoire de dire qu'il a fait le boulot quoi

    sinon, oui effectivement tu as raison, c'est débile de faire un if sur un nombre X de résultat dans une boucle, autant faire un tri dans la requête, plus propre ! voila exactement le type de "correction" que je cherche a avoir.

    sinon pour le HYDRATE_OBJECT que tu proposes je ne sais pas si c'est possible..

  4. #4
    Membre Expert
    Avatar de Alexandre T
    Homme Profil pro
    Ingénieur DevOps
    Inscrit en
    Mai 2002
    Messages
    1 214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur DevOps
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 214
    Par défaut
    Voici déjà quelques conseils :

    Je ne peux pas t'aider, je ne connais pas assez Laravel pour cela.

    Pour la requête où tu ne veux pas afficher les messages non lus que l'utilisateur s'est envoyé à lui-même, le plus judicieux peut-être d'empêcher l'utilisateur de s'envoyer un mail à lui-même :
    • En modifiant le formulaire d'envoi de mail et en ajoutant un validateur et une contrainte dédiée
    • En ajoutant une contrainte d'intégrité dans la base de données qui interdit que le destinataire soit identique à l'expéditeur.



    Mais revenons-en à ton tableau, Si ton site fonctionne, alors ça va être facile. Voici une méthode :
    • Avec git, tu commit ton code et tu crées une branche, comme cela tu pourras revenir en arrière facilement si les étapes suivantes échoues.
    • Grâce au profiler, tu regardes le nombre de requêtes SQL, la mémoire consommée, le temps processeur, tu notes tout cela dans un coin,
    • Tu fais le test avec l'hydratation objet. Tu vas perdre du temps dans le repository, car la sérialisation et la réflexion utilisées par Doctrine sont gourmands, mais tu vas en gagner dans la vue et dans le contrôleur.
    • Grâce au profiler tu fais une petite comparaison et tu auras une réponse technique. Mais dans la vraie vie, mieux vaut choisir l'hydratation. Pourquoi ? Parce que le résultat d'une requête hydratée peut-être mis en cache. Tu ne purges le cache que lors d'un envoi de message à cet utilisateur ou la lecture d'un message et au pire une fois par jour et bam, ta page se chargera bien plus vite


    Au niveau de la qualité architecturale, plus les méthodes sont simples et petites dans une classe, mieux c'est. Si tes classes grossissent trop, il y a (parfois) des façons de l'améliorer (c'était ta question sur les repository ou les managers/models/business model dont on parlait la dernière fois). Malheureusement, c'est souvent bien plus compliqué que ces quelques phrases, mais il est une règle qui marche bien : respecter les couches ! Car en travaillant en couche bien séparée, on peut facilement optimiser chaque couche (et répartir le taf entre plusieurs développeurs)

    Si tu veux vraiment optimiser, tu peux passer ton code sous backfire.io, là c'est du top level, mais c'est balèze et pas donné.

    Sinon, pour la syntaxe et la détection des "problèmes", je te recommande d'ajouter en dev les composants suivants : php-cs-fixer, php mess detector et php code sniffer. Sauvegarde bien ton projet avant d'utiliser php-cs-fixer, car il modifie ton code. Ces trois vont outils déjà t'aider dans la qualité technique de ton code. PHP-CS-Fixer peut même te faire de beaux entêtes pour le copyright. Ils ne t'aideront pas sur l'exemple de la requête à améliorer et des tests à retirer dans la vue, mais ils t'aideront à avoir un code plus sain. En général quand ton code se complique, php mess detector le repère très vite et t'indique les méthodes, les objets qui méritent optimisation.

    Je suis en train de rédiger un tutoriel que je publierai fin mai ou fin juin. Le tutoriel prend un projet Symfony et donne des pistes en améliorer la qualité, à fiabiliser aussi la mise en production. Je montre comment déployé les outils.

    Pour codeur, le problème c'est que c'est devenu un système d'enchères dégressives, car de plus en plus de codeurs tentent d'être le prix le moins élevé. C'est sans doute à cause des clients, qui ne savent pas forcément pourquoi on leur propose une prestation à 1000€ et une autre à 15.000€. Cahier des charges trop vague, refus (étrange) de donner sa fourchette budgétaire, etc.

    En tout cas, améliorer la qualité du code demande beaucoup d'expérience et quand bien même qqn a beaucoup d'expériences, il faudrait qu'il ait créé des projets de la même envergure que toi. Je ne développe pas le même projet Symfony pour un site avec 25 utilisateurs par jours qui font 1000 requêtes (j'optimiserai le Workflow) que pour un site avec un seul utilisateur qui fait 25 000 requêtes (j'optimiserai l'UX pour ses goûts) ou pour 25 000 utilisateurs qui font une seule et même requête (je boosterai le cache et j'optimiserai les systèmes d'inscriptions, la sécurité et le système utilisateur). Je durcis le trait, mais tu as compris.

    Enfin n'oublie pas un truc : si ça marche, que le code est moche, tu crées des tests fonctionnels pour vérifier que ça marche. Si la couverture du code est bonne, bah, tu peux peut-être passé à autre chose. Parfois l'ennemi du bien, c'est le mieux. Passer trop de temps sur un truc te coûte du temps, de l'argent, de l'énergie et pour parfois pas grand chose. Demande toi souvent si le jeu en vaut la chandelle. J'ai dans l'équipe un développeur qui code de façon très propre et qui pourtant cherche encore à améliorer le code, mais il est très très lent. J'ai un ancien collègue qui codait plus vite que son ombre. Mais deux développeurs devaient repasser derrière lui pour tester et corriger les coquilles. Bon, on lui en voulait, il abbattait le travail de 5 développeurs... alors bon...
    Alexandre Tranchant
    Ingénieur DevOps pour le Ministère de l'Écologie
    Retrouvez mes articles sur PHP et Symfony

  5. #5
    Membre éclairé
    Homme Profil pro
    Webmaster
    Inscrit en
    Juillet 2015
    Messages
    518
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Juillet 2015
    Messages : 518
    Par défaut
    J'ai bien pris note de l'ensemble de ton message et je te remercie pour les précieux conseils.
    Je vais essayer de prendre bout de code par bout de code pour voir si déjà moi même je trouve quelque chose. Je pense que c'est un bon début. et revoir le tuto vidéo. Je ne connais pas non plus laravel mais j'aime le schema qu'il propose sur la vidéo, je parle de la façon de schématiser son tuto et non de laravel . C'est fluide, facile a comprendre, code court et non surchargé..

    ok tiens moi au courant pour ton article/tuto.

    merci pour les réponses, au top

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Tableaux] Modifier un tableau sur une page en PHP
    Par leclone dans le forum Langage
    Réponses: 12
    Dernier message: 02/01/2007, 14h06
  2. Modifier un tableau avec innerHTML sous IE
    Par Gédéon dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 06/12/2006, 12h32
  3. Réponses: 11
    Dernier message: 14/10/2006, 21h26
  4. [Debutant] Besoin d'aide pour modifier un tableau...
    Par CyberTwister dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 08/03/2006, 14h14
  5. modifier un tableau avec javascript
    Par lemmings dans le forum Général JavaScript
    Réponses: 27
    Dernier message: 15/11/2005, 10h10

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo