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 :

Factorisation de mon code


Sujet :

Symfony PHP

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    218
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 218
    Par défaut Factorisation de mon code
    Hello !
    J'ai écris un code pour insérer un csv dans ma bdd avec Synfony ! Le code marche bien et j'ai aussi géré les erreur qui pouvait être lié à l'insertion mais le souci c'est que mon code est un peu trop répétitif :
    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    /.../
            $originalFileName = pathinfo($csvFile->getClientOriginalName(), PATHINFO_FILENAME);                  
            $safeFileName = $slugger->slug($originalFileName);              
            $newFileName = $safeFileName.'-'.uniqid().'.'.$csvFile->guessExtension();        
            $csvFile->move($fileDirectory, $newFileName);                    
            $upload->setCsvFile($newFileName);                   
            $manager->persist($upload);
            $csv = Reader::createFromPath($fileDirectory.$newFileName);                    
            $csv->setHeaderOffset(0);
            $csv->setDelimiter(';');
            $csv->setEscape('');
            $records = $csv->getRecords();   
     
            foreach ($records as $record) {
                $numero = $record["Identifiant de la fiche"];
                $date = $record["Date d'emission de la fiche"];
                $origine = $record['Cas origine'];
                $cloture = $record['Cas cloture'];
                $commentaire = $record['Commentaire'];
                $epidemi = $record['Type de cas'];          
                $score = $record['Score'];   
     
                $infection = $manager->getRepository(Infection::class)->findOneBy(['infection' => mb_convert_encoding($record['Type infection'], 'UTF-8', 'Windows-1252')]);
                $structure = $manager->getRepository(Structure::class)->findOneBy(['nom' => mb_convert_encoding($record['Nom de la structure'], 'UTF-8', 'Windows-1252')]);
     
                $commentaire = mb_convert_encoding($commentaire, 'UTF-8', 'Windows-1252');
                $epidemi = mb_convert_encoding($epidemi, 'UTF-8', 'Windows-1252');
     
     
                //verification du numero de la fiche et utilisation pour empecher upload de doublon
                if(!(is_numeric($numero)) || (strlen($numero) !== 5)){
                    $this->addFlash('error','Problème de donnée dans le champs "Identifiant de la fiche"');
                    return $this->redirectToRoute('signalement.upload');  
                }
                $signal = $manager->getRepository(Signalement::class)->findOneBy(['numero' => $numero]);
                if(is_null($signal)){
                    $signal = (new Signalement())->setNumero($numero);
                    $manager->persist($signal);
                }
     
                //verification de la date
                [$d, $m, $y] = explode('/',$date);
                if(!checkdate($m, $d, $y)){
                    $this->addFlash('error','Problème de donnée dans le champ "date d\'émission"');
                    return $this->redirectToRoute('signalement.upload');  
                }
                $dbdate = \DateTimeImmutable::createFromFormat('d/m/Y', $date);
     
                //verification que les champs cas origine et cas cloture soient bien numeric
                if(!(is_numeric($origine)) ||  !(is_numeric($cloture))){
                    $this->addFlash('error','Problème de donnée dans un des champs "Cas origine" et/ou "Cas cloture"');
                    return $this->redirectToRoute('signalement.upload');  
                }        
                //si cas origine est supérieur à cas cloture
                if($origine > $cloture){
                    $this->addFlash('error','Problème de donnée dans un des champs "Cas origine / Cas cloture" le cas d\'origine ne peut pas être supérieur au cas cloture');
                    return $this->redirectToRoute('signalement.upload');  
                }
     
                //si le champ commentaire est vide
                if(empty($commentaire)){
                    $this->addFlash('error','Problème de donnée dans le champ "commentaire", celui-ci ne peut pas être vide');
                    return $this->redirectToRoute('signalement.upload');  
                }
     
                //si le champ Type de cas est valide avec verification type de cas/cas cloture
                if(($epidemi !== "Épidémie") && ($epidemi !== "Cas isolé")){
                    $this->addFlash('error','Problème de donnée dans le champ "Type de cas" en ligne(s) : '. $counter);
                    return $this->redirectToRoute('signalement.upload');  
                }else if(($epidemi !== "Épidémie") && ($cloture > 1)){
                    $this->addFlash('error','Le type de cas ne peut pas être "Cas Isolé" si le nombre de cas cloture est > 1');
                    return $this->redirectToRoute('signalement.upload');
                }else if(($epidemi !== "Cas isolé") && ($cloture == 1)){
                    $this->addFlash('error','Le type de cas ne peut pas être "Épidémie" si le nombre de cas cloture est = 1');
     
                //si le champ Score est valide 
                if(empty($score) || !is_numeric($score) || strlen($score) > 4 || $score > 212){
                    $this->addFlash('error','Problème de donnée dans le champ "Score"');
                    return $this->redirectToRoute('signalement.upload');  
                }
     
                //si le champ Type infection est valide
                if(!(ctype_alpha($infection)) && empty($infection)){
                    $this->addFlash('error','Problème de donnée dans le champ "Type infection"');
                    return $this->redirectToRoute('signalement.upload');  
                }
     
                //si le champ Structure est valide
                if(!(ctype_alpha($structure)) && empty($structure)){
                    $this->addFlash('error','Problème de donnée dans le champ "Structure"');
                    return $this->redirectToRoute('signalement.upload');  
                }  
     
                $signal              
                    ->setDate($dbdate)
                    ->setCasO($origine)
                    ->setCasC($cloture)
                    ->setCommentaire($commentaire)
                    ->setEpidemie($epidemi)
                    ->setCapacite($capacite)              
                    ->setScore($score)      
                    ->setInfection($infection) 
                    ->setStructure($structure)
                    ;
            }
    /.../
     
     
                    return $this->redirectToRoute('signalement.upload');
                }
    https://codeshare.io/5DpjRW
    Et encore il n'y a pas tout !

    Du coup je cherche à factoriser un peu tout ça... La méthode serait donc de créer une fonction en dehors du foreach et appeller la fonction dans le foreach !

    Etant encore debutant je fais d'abord des test mais mes test ne marche pas...

    Dans mon code , juste avant le foreach j'écris cette fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
            function test(string $truc): string
            {
                return "le type est : $truc";
            }
    Et dans mon foreach j'insère cette ligne :
    echo test($type);J’envoie donc le csv en upload, celui-ci est bien flush mais j'ai 0 message echo...

    J'ai essayé en mettant cette ligne ailleurs, en mettant volontairement une mauvaise valeur a un champs et donc mettre cette ligne dans la condition d'erreur lié à la mauvaise valeur... j'ai aussi essayé avec var_dump.... j'ai rien qui s'affiche !

    Comment je peux faire dans un premier temps pour que ca m'affiche correctement chaque valeur de chaque boucle du csv ? merci !

    Ensuite j'aimerais voir pour reduire mon code le plus possible ! Est ce que finalement l'idée de la fonction est la meilleurs selon vous ?

  2. #2
    Expert confirmé Avatar de Toufik83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2012
    Messages
    2 545
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2012
    Messages : 2 545
    Par défaut
    Bonjour,

    Le message de la fonction test ne s'affiche pas car vous changez de route, si vous voulez le visualiser, essayez de mettre un exit(test($type)) juste avant la redirection, ceci arrête complétement le traitement à cette ligne.

    Et en ce qui concerne la factorisation du code, je vois que tous les blocs if else terminent par une redirection vers signalement.upload, seul le message d'erreur changeant à chaque fois, Vous pourriez donc créer une fonction qui personnalise uniquement le message d'erreur avant de déclencher la redirection finale:
    Code php : 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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    function checkErrors($numero,$date,$origine,$cloture,$commentaire,$epidemi,$score,$infection,$structure,$capacite,$manager){
            //verification du numero de la fiche et utilisation pour empecher upload de doublon
            if(!is_numeric($numero) || strlen($numero) !== 5) $msgError='Problème de donnée dans le champs "Identifiant de la fiche"';
            //verification de la date
            [$d, $m, $y] = explode('/',$date);
            if(!checkdate($m, $d, $y)) $msgError='Problème de donnée dans le champ "date d\'émission"';
            $signal = $manager->getRepository(Signalement::class)->findOneBy(['numero' => $numero]);
            if(is_null($signal)){
                $signal = (new Signalement())->setNumero($numero);
                $manager->persist($signal);
            }
            $dbdate = \DateTimeImmutable::createFromFormat('d/m/Y', $date);
     
            //verification que les champs cas origine et cas cloture soient bien numeric
            if(!is_numeric($origine) ||  !is_numeric($cloture)) $msgError='Problème de donnée dans un des champs "Cas origine" et/ou "Cas cloture"';        
            //si cas origine est supérieur à cas cloture
            if($origine > $cloture) $msgError='Problème de donnée dans un des champs "Cas origine / Cas cloture" le cas d\'origine ne peut pas être supérieur au cas cloture';
     
           //si le champ commentaire est vide
            if(empty($commentaire)) $msgError='Problème de donnée dans le champ "commentaire", celui-ci ne peut pas être vide';
     
            //si le champ Type de cas est valide avec verification type de cas/cas cloture
            if($epidemi !== "Épidémie" && $epidemi !== "Cas isolé")
                $msgError='Problème de donnée dans le champ "Type de cas" en ligne(s) : '. $counter;
            else if($epidemi !== "Épidémie" && $cloture > 1)
                $msgError='Le type de cas ne peut pas être "Cas Isolé" si le nombre de cas cloture est > 1';
            else if($epidemi !== "Cas isolé" && $cloture == 1)
                $msgError='Le type de cas ne peut pas être "Épidémie" si le nombre de cas cloture est = 1';
     
            //si le champ Score est valide 
            if(empty($score) || !is_numeric($score) || strlen($score) > 4 || $score > 212) $msgError='Problème de donnée dans le champ "Score"';
     
            //si le champ Type infection est valide
            if(!ctype_alpha($infection) && empty($infection)) $msgError='Problème de donnée dans le champ "Type infection"';
     
            //si le champ Structure est valide
            if(!ctype_alpha($structure) && empty($structure)) $msgError='Problème de donnée dans le champ "Structure"'; 
     
            //Si le message d'erreur est défini, on fait appel à addFlash avec le contenu de l'erreur
            if(isset($msgError)) $this->addFlash('error',$msgError);
    }

    Ensuite vous pourriez l'appeler à l'intérieur de la boucle checkErrors($numero,$date,$signal,$manager,$origine,$cloture,$commentaire,$epidemi,$score,$infection,$structure,$capacite);
    Remarques :
    1- Pas la peine de mettre des accolades {} lorsqu'il y a qu'une seule instruction à exécuter dans un bloc if.
    2- Pas la peine de mettre des parenthèses () autour des conditions simples, donc if(!(is_numeric($numero)) || (strlen($numero) !== 5)) est la même chose que if( !is_numeric($numero) || strlen($numero) !== 5 )
    3- Vous avez une discussion encore ouverte à laquelle vous n'avez pas répondu ...

Discussions similaires

  1. Mon code n'est pas interprété !
    Par korriganez dans le forum Langage
    Réponses: 3
    Dernier message: 31/05/2006, 16h46
  2. [Exécutable]puis je creer un executable a partir de mon code ?
    Par youpileouf dans le forum Général Java
    Réponses: 3
    Dernier message: 17/06/2005, 10h15
  3. Optimiser mon code ASP/HTML
    Par ahage4x4 dans le forum ASP
    Réponses: 7
    Dernier message: 30/05/2005, 11h29
  4. Réponses: 1
    Dernier message: 21/02/2005, 13h40
  5. [langage] algo de bissection dans mon code
    Par killy dans le forum Langage
    Réponses: 5
    Dernier message: 19/01/2004, 19h35

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