Vous souhaitez nous soutenir ? Devenez sponsor de l'association sur notre page Github
Tutoriels

Les Seeders

Antoine Benevaut avatar
Publié le 26 juin 2024
Couverture de l'article Les Seeders

Vous aussi, vous avez été confronté à devoir faire la démonstration d'un projet, le code est prêt mais… pas la base de données ? Projet à rendre lors de vos études, démonstration à un client ou encore votre Product Owner/Commercial ne retrouve plus son cas de test ?

Construisez avec les Seeders un jeu de données solide qui peut vous accompagner dans de nombreuses situations. Si le code doit parler de lui-même, les Seeders vous rendrons le plus grand des services en cartographiant votre base de données.

Qui sème menu récolte dru

Les Seeders sont des Classes spécialisées dans la constitution de jeux de données qui peuvent être utilisés aussi bien lors de vos développements que lors de vos mises en production.

Une commande vous permettra de les générer simplement, dans le répertoire database/seeders.

1php artisan make:seeder UserSeeder
2 
3# Pour placer le seeder dans un namespace (et un repertoire):
4php artisan make:seeder "Domain\\UserSeeder"

Bien que les Seeders générés soient entreposés dans database/seeders, ils appartiennent à un Namespace et vous pourrez les mettre où vous le souhaitez dans votre projet, pratique pour les fans d'architectures.

Une seconde commande vous permettra d'exécuter vos Seeders.

1php artisan db:seed

Point d'attention ici, il existe un Seeder principale, le DatabaseSeeder, il est livré avec Laravel. Si vous ne renseignez aucun paramètre lors de l'exécution des seeders, c'est lui qui sera exécuté par défaut.

Pour en exécuter un particulier, faite comme ceci :

1php artisan db:seed --class=UserSeeder

À quoi ressemble un seeder ?

Voici le database/seeders/DatabaseSeeder.php, livré avec Laravel.

Les Seeders sont des classes très simples, qui étendent la classe Illuminate\Database\Seeder et implémentent la méthode run() qui sera le point de départ de leur execution.

1<?php
2 
3namespace Database\Seeders;
4 
5use Illuminate\Database\Seeder;
6 
7class DatabaseSeeder extends Seeder
8{
9 public function run(): void {}
10}

Leur code est généralement orienté vers la gestion de données avec les outils comme DB (Illuminate\Facade\DB), les Factories, l'appel d'autres seeders.

1<?php
2 
3// Appel d'une Factory
4\App\Models\User::factory(10)->create();

Notez qu'en bonne pratique, je vous recommande de favoriser les insertions, les mises à jour et les suppressions en masse plutôt que les instructions unitaires, cela vous fera gagner du temps d'exécution. Jetez un oeil à la documentation.

1<?php
2 
3# ❌ insertion unitaire
4DB::table('users')->insert(['email' => 'picard@example.com']);
5DB::table('users')->insert(['email' => 'janeway@example.com']);
6 
7# ✅ insertion en masse
8DB::table('users')->insert([
9 ['email' => 'picard@example.com'],
10 ['email' => 'janeway@example.com'],
11]);

Lorsque vous appelez des Seeders pour remplir des actions subsidiaires, ou pour des actions réutilisables, vous pourrez passer des arguments à ce Seeder pour lui indiquer son contexte d'exécution.

1// Appel d'un Seeder
2$this->call(
3 UserSeeder::class,
4 $silent = false,
5 [ /* arguments passés au seeder */ ]
6);

Pour les plus aventureux, vous pouvez aussi utiliser des instructions de packages, comme dans l'exemple qui suit avec spatie/laravel-permission :

1<?php
2 
3// Appel d'une instruction du package spatie/laravel-permission
4app()[\Spatie\Permission\PermissionRegistrar::class]
5 ->forgetCachedPermissions();

Dans mes projets, je mets souvent rapidement en place les Seeders.

Ils me permettent de sécuriser mon avancement en décrivant les entités stockées dans la base de données ainsi que les cas précis de l'utilisation de cette base de données. C'est un aide-mémoire qui me permet d'éviter de documenter les combinaisons des données des entités et de m'y replonger facilement lorsque je dois revenir sur un sujet plusieurs mois après une phase de développement.

C'est aussi un outil d'assurance qualité qui m'accompagne pendant le développement et la rédaction de mes tests fonctionnels. De cette façon, j'ai une base de données solide pour les phases de tests manuel (mes PO adorent).

C'est maintenant à votre tour de les essayez, vous verrez, vous ne pourrez plus vous en passer.

Source : https://gist.github.com/abenevaut/7b8a33b546aea3520f9f19cbacd0315c

A lire

Autres articles de la même catégorie