Partage
  • Partager sur Facebook
  • Partager sur Twitter

[SYMFONY 5] Limiter les exemplaires d'une entité.

    28 novembre 2021 à 19:27:39

    Bonjour tout le monde.

    Simple question qui me trotte dans la tête depuis un moment.

    Comment limiter le nombre d'exemplaires d'une entité à un seuil défini.

    Je m'explique :

    Imaginons que j'ai une entité "Produit". Je veux qu'a partir de 10 produits créés (10 exemplaires de cette entité dans la base de données), il soit impossible d'en créer de nouveaux. J'ai un but sous-jacent à cette interrogation. Sur mon application Symfony 5, je souhaite avoir une entité pour gérer quelques options générales (Message d'accueil, affichage d'une section On/Off, ect...).

    Actuellement, pour faire cela, j'ai créé plusieurs entités dont j'ai regroupé les formulaires d'administration dans une seule page. Par exemple : une entité "Message d'accueil" avec un paramètre "Text" qui prend son contenu et un booléen pour indiquer si oui ou non il faut l'afficher.

    Je n'ai besoin que d'un "Message d'accueil", je limite donc la création de cette entité à 1 seul exemplaire dans un controller qui vérifie si oui ou non, il y a déjà un exemplaire de cette entité dans la base de données.

    Cette option marche, mais n'est pas très optimisée voire pas pratique du tout. Il y a t-il la possibilité de procéder autrement ? Via la création d'une entité limitée à un exemplaire unique ou autre ?

    Cordialement.

    Guillaume.

    -
    Edité par Guillaume_Samson 28 novembre 2021 à 19:35:35

    • Partager sur Facebook
    • Partager sur Twitter
      28 novembre 2021 à 21:06:29

      Bonsoir,

      Pour les entités uniques, tu peux utiliser le design pattern Singleton. Pour les exemplaires dont le nombre peut varier, une propriété entière et statique au sein des classes concernées pourrait résoudre le problème.

      Je ne suis pas complètement familier avec Symfony 5, donc je ne saurais pas dire si le framework propose des alternatives.

      • Partager sur Facebook
      • Partager sur Twitter
        28 novembre 2021 à 21:35:51

        Omiganox a écrit:

        Bonsoir,

        Pour les entités uniques, tu peux utiliser le design pattern Singleton. Pour les exemplaires dont le nombre peut varier, une propriété entière et statique au sein des classes concernées pourrait résoudre le problème.

        Je ne suis pas complètement familier avec Symfony 5, donc je ne saurais pas dire si le framework propose des alternatives.


        Merci pour l'info, j'avais oublié cette possibilité. Je regarde ça plus de près. Cependant, de mémoire un Singleton permet de gérer l'unicité d'un appel à la classe. Dans mon cas, j'ai aussi besoin d'enregistrer des données dans une base de données et non pas de savoir combien de fois la classe est instanciée.

        Je regarde ça de plus près quand même :)

        • Partager sur Facebook
        • Partager sur Twitter
          29 novembre 2021 à 7:16:16

          Bonjour,

          Alternative proposée : il n'y pas de limitation ... mais par contre il n'est restitué qu'un certain nombre d'objets.

          Par exemple, il n'est restitué que le dernier message "Message d'Accueil". Ce qui est très facile avec les méthodes standards de Symfony.

          Ayant eu le besoin exprimé, c'est ainsi que j'ai procédé. Autre intérêt, pas de perte de l'historique si besoin.

          A+

          • Partager sur Facebook
          • Partager sur Twitter
            29 novembre 2021 à 12:43:55

            Guillaume_Samson a écrit:

            Dans mon cas, j'ai aussi besoin d'enregistrer des données dans une base de données et non pas de savoir combien de fois la classe est instanciée.

            Une autre solution serait de contrôler la création de nouveaux exemplaires dans ta base de données en utilisant un trigger : si la limite a été atteinte pour tel exemplaire, la requête d'insertion devra être annulée.
            • Partager sur Facebook
            • Partager sur Twitter
              29 novembre 2021 à 12:53:13

              monkey3d a écrit:

              Bonjour,

              Alternative proposée : il n'y pas de limitation ... mais par contre il n'est restitué qu'un certain nombre d'objets.

              Par exemple, il n'est restitué que le dernier message "Message d'Accueil". Ce qui est très facile avec les méthodes standards de Symfony.

              Ayant eu le besoin exprimé, c'est ainsi que j'ai procédé. Autre intérêt, pas de perte de l'historique si besoin.

              A+


              C'est la solution que j'utilise à l'heure actuelle :), du moins ça y ressemble.

              Ça fait le job, mais c'est vraiment pas propre, ne serait-ce que pour maintenir le code dans le temps.

              J'ai fait quelques recherches, l'idée d'une classe Singleton me parait pas trop mal mais à adapter dans le contexte.

              Dans l'idée, il faudrait que je créer une classe "AppSettings" (car je veux créer une classe qui gère les paramètres globaux du site). Le problème, c'est que je ne veux pas que cette classe soit une entité avec une "ID" ou qu'on puisse créer plusieurs exemplaires de cette classe dans la base de données. Je veux que ce soit un objet unique et non dupliquable (un peu comme un objet JSON ou autre) qui puisse être modifiable par le biais d'une interface d'administration.

              J'ai fait quelques recherches sur le sujet, et voici une solution qui donne un début de réponse à ma problématique.

              https://github.com/umanit/doctrine-singleton-bundle

              Je ne sais pas si c'est possible de faire un équivalent dans Symfony. C'est à dire, utiliser un objet unique (et non une entité) modifiable et utilisable dans Twig.

              Concernant les objets "mutables" et enregistrables dans une BDD , j'ai aussi un début de réponse sur la documentation de ORM mais c'est pas hyper clair.

              https://www.doctrine-project.org/projects/doctrine-orm/en/latest/tutorials/embeddables.html

              • Partager sur Facebook
              • Partager sur Twitter
                30 novembre 2021 à 6:49:33

                C'est la solution que j'utilise à l'heure actuelle :), du moins ça y ressemble.

                Ça fait le job, mais c'est vraiment pas propre, ne serait-ce que pour maintenir le code dans le temps.

                ==> En quoi ce n'est pas propre et quel besoin de maintenir le code dans le temps ???? 

                Par exemple pour restituer seulement de dernier message :

                $message = $this->entityManager->getRepository(Message::class)->findOneBy([], ['id' => 'desc']);

                De plus comme mon entité Message comporte des relations je ne les casse pas et je peux retrouver qui a posté un message il y a éventuellement 3 mois.

                Néanmoins je suivrai la discussion car c'est toujours intéressant de connaître de nouvelles perspectives.

                A+

                -
                Edité par monkey3d 30 novembre 2021 à 6:50:28

                • Partager sur Facebook
                • Partager sur Twitter
                  2 décembre 2021 à 17:28:48

                  Cette solution marche, mais elle ne me satisfait qu'à moitié.

                  L'idéal, ce serait vraiment d'avoir une classe "AppSettings". Pas besoin d''ID, puisque je veux qu'un seul et unique objet pour gérer les variables de la classe.

                  Je veux rendre impossible la création d'un second object "AppSettings". J'en ai besoin que d'un seul.

                  Alors oui ce bout de code fonctionne.

                  $this->entityMananger->getRepository(AppSettings::class)->findOneBy([], ASC)
                  
                  // ça me ressort mon premier item dans la BDD, donc l'objet que je veux.

                  Je ne sais trop comment l'exprimer, mais je trouve ça pas très propre, pas optimisé :p.

                  Je me demandais juste si il y avait un autre moyen de faire une classe ou un objet dédié à des paramètres globaux.

                  Quand on appelle la classe "AppSettings", je veux que ce soit uniquement l'objet que je veux, sans aucune manipulation dans le controller ou autre.

                  -
                  Edité par Guillaume_Samson 2 décembre 2021 à 17:29:22

                  • Partager sur Facebook
                  • Partager sur Twitter

                  [SYMFONY 5] Limiter les exemplaires d'une entité.

                  × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                  × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                  • Editeur
                  • Markdown