Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 93
0.00% covered (danger)
0.00%
0 / 2
CRAP
0.00% covered (danger)
0.00%
0 / 1
Oflix
0.00% covered (danger)
0.00%
0 / 93
0.00% covered (danger)
0.00%
0 / 2
210
0.00% covered (danger)
0.00%
0 / 1
 __construct
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 load
0.00% covered (danger)
0.00%
0 / 92
0.00% covered (danger)
0.00%
0 / 1
182
1<?php
2
3namespace App\DataFixtures;
4
5use App\Entity\Casting;
6use App\Entity\Genre;
7use App\Entity\Movie;
8use App\Entity\Person;
9use App\Entity\Season;
10use App\Entity\Type;
11use App\Entity\User;
12use App\Repository\MovieRepository;
13use App\Services\OmdbApi;
14use Bluemmb\Faker\PicsumPhotosProvider;
15use Xylis\FakerCinema\Provider\Movie as FakerMovieProvider;
16use Xylis\FakerCinema\Provider\TvShow as FakerTvShowProvider;
17use Xylis\FakerCinema\Provider\Person as FakerPersonProvider;
18use DateTime;
19use Doctrine\Bundle\FixturesBundle\Fixture;
20use Doctrine\Persistence\ObjectManager;
21
22class Oflix extends Fixture
23{
24
25    /**
26     * Service OmdbApi
27     *
28     * @var OmdbApi
29     */
30    private $omdbApi;
31
32    /**
33    * Constructor
34    */
35    public function __construct(OmdbApi $omdbApi)
36    {
37        $this->omdbApi = $omdbApi;
38    }
39    /**
40     * Création de donnée
41     *
42     * @param ObjectManager $manager Equivalent à l'EntityManager
43     */
44    public function load(ObjectManager $manager): void
45    {
46        // utilisation de Faker
47        // use the factory to create a Faker\Generator instance
48        // Faker US
49        $faker = \Faker\Factory::create();
50        $fakerFr = \Faker\Factory::create('fr_FR');
51
52        // * les providers vont ajouter des méthodes avec de nouvelles fausses données
53        $faker->addProvider(new PicsumPhotosProvider($faker));
54        // ? on utilise le use pour donner un alias à la classe, que PHP ne se trompe pas avec notre entité
55        $faker->addProvider(new FakerMovieProvider($faker));
56        $faker->addProvider(new FakerPersonProvider($faker));
57        $faker->addProvider(new FakerTvShowProvider($faker));
58
59
60        // * la création de données
61        // 1. faire une nouvelle instance d'une entité
62        // 2. remplir toutes les propriétés obligatoires de cette instance
63        // 3. demander au manager de persiter l'entité
64        // 4. stocker dans un tableau les entités pour les relations futures
65
66        // TODO : créer 3 utilisateurs, chacun avec un ROLE
67        $admin = new User();
68        $admin->setEmail("admin@admin.com");
69        // * on donne le mot de passe hashé
70        // mdp : admin
71        $admin->setPassword('$2y$13$UX6UDREB8cdTuNVt3i9QcOFcyFqcQbCk.yh.D9rgYHJzs4GrfD/w.');
72        $admin->setRoles(['ROLE_ADMIN']);
73
74        $manager->persist($admin);
75
76        $managerUser = new User();
77        $managerUser->setEmail("manager@manager.com");
78        // * on donne le mot de passe hashé
79        // mdp : manager
80        $managerUser->setPassword('$2y$13$ehwmxDazwOE8ol3eTRz/C.YapEQ8UMyDFzolfGCg97gegVtOwjXu6');
81        $managerUser->setRoles(['ROLE_MANAGER']);
82
83        $manager->persist($managerUser);
84
85
86        $user = new User();
87        $user->setEmail("user@user.com");
88        // * on donne le mot de passe hashé
89        // mdp : user
90        $user->setPassword('$2y$13$J9VkB737ouoPOiH0oTGNQOlvqxZ6Hz95mZiubq/kFzgJ2B7nt608m');
91        $user->setRoles(['ROLE_USER']);
92
93        $manager->persist($user);
94
95
96        // TODO : créer 10 Genres
97        $genres = ["Action", "Animation", "Aventure", "Comédie", "Dessin Animé", "Documentaire", "Drame", "Espionnage", "Famille", "Fantastique", "Historique", "Policier", "Romance", "Science-fiction", "Thriller", "Western"];
98        // TODO : faire un foreach sur le tableau pour avoir des données plus réaliste
99        /** @var Genre[] $allGenre */
100        $allGenre = [];
101        foreach ($genres as $genreName) {
102            // TODO on commence par en créer 1, puis on fait une boucle
103            // * faire un new
104            $newGenre = new Genre();
105
106            // * remplir les propriétés
107            $newGenre->setName($genreName);
108
109            // * appeler la méthode persist avec notre entité
110            // on demande la persitance de l'objet
111            $manager->persist($newGenre);
112
113            // 4. pour les fixtures : un tableau avec tout les genres
114            $allGenre[] = $newGenre;
115        }
116
117        // TODO : créer les 2 types : film et série
118        $types = ["film", "série"];
119        /** @var Type[] $allTypes */
120        $allTypes = [];
121        foreach ($types as $type) {
122            // * faire un new
123            $newType = new Type();
124
125            // * remplir les propriétés
126            $newType->setName($type);
127
128            // * appeler la méthode persist avec notre entité
129            // on demande la persitance de l'objet
130            $manager->persist($newType);
131
132            // 4. tableau de fixtures
133            $allTypes[] = $newType;
134        }
135
136        // TODO : 2000 person
137        /** @var Person[] $allPerson */
138        $allPerson = [];
139        for ($i=0; $i < 2000; $i++) { 
140            // 1. faire une nouvelle instance
141            $newPerson = new Person();
142            //2. remplir les prop
143            // si on utilise le faker cinema, il faut rajouter un traitement pour séparer prénom / nom
144            $actorFullName = $faker->actor();// Cate Blanchett
145            $actorNames = explode(" ", $actorFullName);
146            // ! JB aime pas l'utilisation de ce tableau sans vérifier que les index existe
147            $newPerson->setFirstname($actorNames[0]);
148            $newPerson->setLastname($actorNames[1]);
149
150            // 3. demander la persitance
151            $manager->persist($newPerson);
152
153            // 4. pour les fixtures : un tableau avec toutes les personnes
154            $allPerson[] = $newPerson;
155
156        }
157
158        // TODO : créer 10 films => limite pour l'API
159        /** @var Movie[] $allMovies */
160        $allMovies = [];
161        for ($i=0; $i < 10; $i++) { 
162            // 1. instance
163            $newMovie = new Movie();
164            // 2. prop
165            // * on décalle la propriété title car avec le faker on veux différencier les titres
166            $newMovie->setDuration(mt_rand(10, 360));
167            $newMovie->setRating(mt_rand(0,50) / 10);
168            $newMovie->setSummary($fakerFr->realText());
169            $newMovie->setSynopsis("lorem ipsum synopsis");
170            // ? https://www.php.net/manual/fr/datetime.construct.php
171            $newMovie->setReleaseDate(new DateTime("1970-01-01"));
172            $newMovie->setCountry("FR");
173
174            $defaultUrl = "https://amc-theatres-res.cloudinary.com/amc-cdn/static/images/fallbacks/DefaultOneSheetPoster.jpg";
175            $picsumDefaultUrl = "https://picsum.photos/200/300";
176            
177            $picsumSeededUrl = "https://picsum.photos/seed/radium".$i."/200/300";
178
179            $fakerPicsumSeededUrl = $faker->imageUrl(200,300, 'radium-' . $i);
180            $newMovie->setPoster($fakerPicsumSeededUrl);
181            
182            // 2.bis : les associations
183            $randomType = $allTypes[mt_rand(0, count($allTypes)-1)];
184            $newMovie->setType($randomType);
185
186            // * on décalle la propriété title car avec le faker on veux différencier les titres
187            if ($randomType->getName() === "série"){
188                $newMovie->setTitle($faker->tvShow());
189            } else {
190                $newMovie->setTitle($faker->movie());
191            }
192            
193            // TODO utiliser le service que vous avez créé : OMDBAPI
194            // $omdbApiModel = $this->omdbApi->fetch("aaaaa");
195            // dd($omdbApiModel->getPoster());
196            $omdbApiModel = $this->omdbApi->fetch($newMovie->getTitle());
197            // dd($omdbApiModel);
198            $newMovie->setPoster($omdbApiModel->getPoster());
199
200            // 3. persist
201            $manager->persist($newMovie);
202
203            // 4. tableau de fixtures
204            $allMovies[] = $newMovie;
205        }
206
207        // TODO : création de casting : il nous faut les objets Person ET les objets Movie
208        // Pour chaque film, je veux entre 3 et 5 casting
209        foreach ($allMovies as $movie) {
210            //random nb casting
211            $randomNbCasting = mt_rand(3,5);
212            for ($i=1; $i <= $randomNbCasting; $i++) { 
213                // 1 .
214                $newCasting = new Casting();
215                // 2. 
216                $newCasting->setRole("Role #" . $i);
217                $newCasting->setCreditOrder($i);
218                // 2.b
219                $newCasting->setMovie($movie);
220                $randomPerson = $allPerson[mt_rand(0, count($allPerson)-1)];
221                $newCasting->setPerson($randomPerson);
222                //3. persist
223                $manager->persist($newCasting);
224            }
225        }
226
227        // TODO : association de Genre avec Movie : entre 3 et 5 genre par film
228        foreach ($allMovies as $movie) {
229            $randomNbGenre = mt_rand(3,5);
230            for ($i=0; $i <= $randomNbGenre; $i++) { 
231                // 1. je cherche un genre aléatoire
232                $randomGenre = $allGenre[mt_rand(0, count($allGenre)-1)];
233                // 2. je remplit l'association
234                $movie->addGenre($randomGenre);
235                // 3. pas de persist car les 2 objets (movie / genre) sont déjà connu de Doctrine
236            }
237        }
238
239        // TODO : association de Season avec Movie : entre 3 et 10 Season par série
240        foreach ($allMovies as $movie) {
241            // je teste si le type est une série
242            if ($movie->getType()->getName() == "série")
243            {
244                $randomNbSeason = mt_rand(3,10);
245                for ($i=1; $i <= $randomNbSeason; $i++) { 
246                    // 1. 
247                    $newSeason = new Season();
248                    // 2. 
249                    $newSeason->setNumber($i);
250                    $newSeason->setNbEpisodes(mt_rand(12, 24));
251                    // 2.b Movie est le porteur, c'est donc avec movie que l'on renseigne l'association
252                    $movie->addSeason($newSeason);
253
254                    //3. persist
255                    $manager->persist($newSeason);
256                }
257            }
258        }
259
260        // * appeler la méthode flush
261        // c'est ici que les requetes SQL sont exécutées
262        $manager->flush();
263    }
264}