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($commentaire);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 dans le CSV, et mettre mon echo 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 ?