Code Coverage |
||||||||||
Lines |
Functions and Methods |
Classes and Traits |
||||||||
Total | |
0.00% |
0 / 93 |
|
0.00% |
0 / 2 |
CRAP | |
0.00% |
0 / 1 |
Oflix | |
0.00% |
0 / 93 |
|
0.00% |
0 / 2 |
210 | |
0.00% |
0 / 1 |
__construct | |
0.00% |
0 / 1 |
|
0.00% |
0 / 1 |
2 | |||
load | |
0.00% |
0 / 92 |
|
0.00% |
0 / 1 |
182 |
1 | <?php |
2 | |
3 | namespace App\DataFixtures; |
4 | |
5 | use App\Entity\Casting; |
6 | use App\Entity\Genre; |
7 | use App\Entity\Movie; |
8 | use App\Entity\Person; |
9 | use App\Entity\Season; |
10 | use App\Entity\Type; |
11 | use App\Entity\User; |
12 | use App\Repository\MovieRepository; |
13 | use App\Services\OmdbApi; |
14 | use Bluemmb\Faker\PicsumPhotosProvider; |
15 | use Xylis\FakerCinema\Provider\Movie as FakerMovieProvider; |
16 | use Xylis\FakerCinema\Provider\TvShow as FakerTvShowProvider; |
17 | use Xylis\FakerCinema\Provider\Person as FakerPersonProvider; |
18 | use DateTime; |
19 | use Doctrine\Bundle\FixturesBundle\Fixture; |
20 | use Doctrine\Persistence\ObjectManager; |
21 | |
22 | class 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 | } |