Dans ce nouveau chapitre on va découvrir le système de Seeding et de Factory qui va vous permettre de pouvoir pré-remplir votre base de données avec des données de test. C'est très pratique pendant la phase de développement pour simuler une application fonctionnelle mais aussi pour la mise en place de tests fonctionnels que l'on découvrira plus tard.
Le principe du seeding est assez simple, on va avoir une classe DatabaseSeeder
dans le dossier database qui va contenir une méthode run()
qui contiendra les instruction pour remplir la base de données. Pour créer rapidement des enregistrement ce seeder pourra se reposer sur un autre type de classe : les Factory
.
Factory
Les Factory
permettent de générer rapidement un model avec des données aléatoires. Pour la génération de ces données Laravel se repose sur la librairie Faker. Vous avez d'ailleurs un exemple de Factory inclut par défaut pour le model User :
<?php
namespace Database\Factories;
use Illuminate\Database\Eloquent\Factories\Factory;
use Illuminate\Support\Str;
/**
* @extends \Illuminate\Database\Eloquent\Factories\Factory<\App\Models\User>
*/
class UserFactory extends Factory
{
/**
* Define the model's default state.
*
* @return array<string, mixed>
*/
public function definition(): array
{
return [
'name' => fake()->name(),
'email' => fake()->unique()->safeEmail(),
'email_verified_at' => now(),
'password' => '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', // password
'remember_token' => Str::random(10),
];
}
public function unverified(): static
{
return $this->state(fn (array $attributes) => [
'email_verified_at' => null,
]);
}
}
La méthode definition()
renvoie un tableau avec les valeurs de bases à sauvegarder lorsque l'on créera un faux utilisateur. La méthode unverified()
permet de définir un état spécifique afin de créer plus facilement une variation. Une fois ce Factory créé on va pouvoir l'utiliser dans notre seeder à l'aide de la méthode factory()
sur nos models.
$user = User::factory()->create();
// Avec un état
$unverifiedUser = User::factory()->unverified()->create();
Vous pouvez aussi utiliser ce factory pour générer plusieurs enregistrements à la fois.
$users = User::factory()->count(3)->create();
Vous pouvez découvrir les méthodes liées au factory en vous rendant sur la documentation.
Seeding
Une fois votre DatabaseSeeder
rempli vous pourrez demander à Laravel de remplir votre base de données à l'aide de la commande.
php artisan db:seed
Cette commande va ajouter les enregistrements sans effacer les données déjà présentes dans votre base de données. Vous repartir de 0 (relancer les migrations et le seeding) à l'aide de la commande.
php artisan migrate:fresh --seed