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 | } |