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 :

Gestion exception Doctrine (l'ignorer)


Sujet :

Symfony PHP

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2013
    Messages
    97
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 97
    Points : 40
    Points
    40
    Par défaut Gestion exception Doctrine (l'ignorer)
    Bonjour,

    J'ai encore un peu de mal avec la gestion des exceptions, je viens donc demander un petit coup de main ici ^^

    J'ai une table dans laquelle je veux que le rassemblement de deux attributs soient uniques, pour cela j'ai mis l'annotation suivante à mon entité :

     @ORM\Table(uniqueConstraints={ORM\UniqueConstraint(name="unique_list_member", columns={"mail", "listUser_id"})})
    Mon but étant que lorsqu'on ajoute plusieurs adresses mail à une liste, il ignore l'ajout si la combinaison mail et listUser_id existe déjà.

    Mon soucis est qu'actuellement il lève bien une exception lorsque je veux rajouter deux mails identiques à une même liste mais ce que je voudrais faire moi c'est tout simplement ignorer l'ajout et passer au suivant.

    Pour l'instant j'ai ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    $em -> persist($list);
    try
    {
        $em->flush();
    }
    catch(DBALException $e)
    {
        var_dump($e);
    }
    Y a-t-il une bonne façon de procéder pour gérer cela ?

    Merci d'avance,

    Jonathan

  2. #2
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Septembre 2009
    Messages
    875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Septembre 2009
    Messages : 875
    Points : 1 313
    Points
    1 313
    Par défaut
    Pour moi, ta base de données a la responsabilité de gueuler si elle a un doublon.
    Ce que tu énonces est une règle métier, elle devrait donc être décorrélé de doctrine.
    Tu peux surement faire en sorte d'ignorer les doublons dans ta liste d'objet à persister.

    Si tu tiens à tout prix a faire comme tu as commencé voici une piste, mais je trouve ca plutot dégueu :p
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    catch (  DBALException $e)
    {
      if($e->getPrevious()->getCode() == 23000) {
        if( $e->getPrevious()->errorInfo[1] == 1062) {
          //on fait rien
        } else {
          throw $e; //l'erreur ne correspond pas, on la renvoit au dessus
        }
      }else {
        throw $e;  //l'erreur ne correspond pas, on la renvoit au dessus
      }
    }

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2013
    Messages
    97
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 97
    Points : 40
    Points
    40
    Par défaut
    Ouai t'as raison je pense que je vais plutôt gérer ça en dehors de Doctrine, par contre je me demande où et comment c'est le plus optimisé...

    En fait j'ai une entité ListUser qui va contenir l'ensemble des listes de diffusion et une entité MembersOfList qui contient l'ensemble des membres de la liste (donc des mails) et donc une relation ManyToOne entre les deux.

    Je pense que je peux juste avant de persister et et flush, parcourir l'ensemble des MembersOfList de ma ListUser que je veux update, stocker les mails dans un tableau et dès que j'en vois un qui existe déjà je l'enlève de ma ListUser. Je ne sais pas s'il y a moyen de faire plus optimisé ou pas, la charge du serveur étant un élément très important dans notre projet :/

    Merci beaucoup pour l'aide que tu m'apportes Gototog

  4. #4
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Septembre 2009
    Messages
    875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Septembre 2009
    Messages : 875
    Points : 1 313
    Points
    1 313
    Par défaut
    D'après ton cas, je ne vois que le filtre que tu as décris.
    Je pense que ça devrait être effectué lorsque tu récupères les mails de toutes tes listes de diffusion.
    Si tu traites pas des millions de mails ça devrait être indolore niveau performance, utilise plutôt isset( $emails[$member->getEmail()] ) que in_array( $member->getEmail(), $emails ) pour grapiller quelques microsecondes.

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2013
    Messages
    97
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 97
    Points : 40
    Points
    40
    Par défaut
    Je ne sais pas pourquoi mais le isset ne fonctionne pas, j'ai l'impression qu'il retourne toujours false...

    M'enfin j'ai une question un peu plus intéressante, dans ma liste j'ai donc le champ MembersOfList qui est en OnetoMany, jusqu'à maintenant tout fonctionnait parfaitement bien. Sauf que maintenant suite à l'ajout du code dont on vient de parler j'ai du à un moment faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $list->removeMembersOfList($member);
    qui renvoit à la fonction suivante de la liste :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public function removeMembersOfList(...\MembersOfList $membersOfList)
        {
            $this->membersOfList->removeElement($membersOfList);
        }
    Cette fonction a été générée via la ligne de commande "php app/console doctrine:generate:entities ListUser"
    Seulement il me dit que la fonction removeElement() ne s'applique qu'à un objet, j'ai donc recherché par ci par là et j'ai remarqué qu'il fallait ajouter ceci dans le constructeur :
    $this->membersOfList = new ArrayCollection();

    Par contre, suite à ça il me mettait une exception lors des ajouts de membres au listes comme quoi je n'ai pas mis l'id de la liste dans le membre. Alors qu'avant ça ne posait aucun problème, et pour cause j'avais rajouté, comme dans toute relation bidirectionnelle, dans le addMembersOfList la définition de la liste comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public function addMembersOfList(\InApps\PassWayBundle\Entity\MembersOfList $membersOfList)
        {
            $this->membersOfList[] = $membersOfList;
            $membersOfList -> setListUser($this);
     
            return $this;
        }
    Et ça ça fonctionnait parfaitement quand l'attribut membersOfList de ma liste était un tableau et pas une ArrayCollection, depuis que je l'ai mis en ArrayCollection il ne passe même pas par mon addMembersOfList (j'y ais mis un texte et un exit dedans et il n'y est pas allé).

    Du coup je me demande si je n'ai pas loupé un truc quelque part là, je trouve ça un peu bizarre ^^ comme solution provisoire pour que ça fonctionne j'ai mis à tous les objets membersOfList l'id de la liste actuellement manipulée à la main :

    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
    17
    $mailList = array();
                    foreach($list->getMembersOfList() as $member){
                        if(in_array($member->getMail(), $mailList)){
                            //s'il est dans le tableau ça signifie que le mail est en double, on l'enlève
     
                            $list->removeMembersOfList($member);
                        }
                        else{
                            //sinon on le laisse et on l'ajoute au tableau
                            array_push($mailList,$member->getMail());
     
                            //on en profite pour ajouter au membre l'id de la liste, je ne sais pas pourquoi lorsque je le met dans mon
                            //addMembersOfList ça ne fonctionne pas, il n'est même pas appelé !
                            $member->setListUser($list);
     
                        }
                    }
    J'ai bien conscience que c'est assez brouillon j'espère que je me suis pas trop mal exprimé, si tu veux que je réexplique n'hésites pas à demander ^^

Discussions similaires

  1. Gestion exceptions silencieuses
    Par obione dans le forum Delphi
    Réponses: 4
    Dernier message: 16/01/2007, 08h46
  2. Réponses: 5
    Dernier message: 30/01/2006, 14h18
  3. Réponses: 2
    Dernier message: 15/11/2005, 09h58
  4. Gestion exceptions sql server 2000
    Par gdido dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 08/10/2005, 10h27
  5. Exemples XMLGram Chart et Gestion Exception
    Par Sylvain James dans le forum XMLRAD
    Réponses: 5
    Dernier message: 05/05/2003, 18h50

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