Une nouvelle approche introduite dans Laravel rend le partage de données entre des seeders plus clair et moins fragile en évitant les mauvais patterns comme les variables statiques ou les requêtes redondantes. Grâce à la façade Context, il est désormais possible d’enregistrer des données dès leur création et de les injecter ensuite dans d’autres seeders via des attributs contextualisés, évitant ainsi tout couplage excessif entre les classes de seeders .

Cette approche apporte plusieurs innovations notables : elle simplifie le flux de données entre seeders, garantit une meilleure structure et une séparation claire des responsabilités, tout en permettant un partage de données propre et typé. Les seeders restent focalisés sur leur mission sans avoir à connaître l’état global ou à recourir à des hacks.

<?php
namespace Database\Seeders;
 
use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\Context;
use Illuminate\Container\Attributes\Context as ContextAttribute;
use App\Models\User;
use App\Models\Project;
 
class AdminSeeder extends Seeder
{
    public function run(): void
    {
        $admin = User::factory()->create(['email' => 'admin@example.com', 'role' => 'administrator']);
        Context::add('admin_user', $admin);
    }
}
 
class ProjectSeeder extends Seeder
{
    public function run(
        #[ContextAttribute('admin_user')] User $admin
    ): void {
        Project::factory()->create([
            'name' => 'Dashboard',
            'owner_id' => $admin->id,
            'status' => 'active',
        ]);
    }
}

Dans cet exemple, la création de l’utilisateur administrateur est centralisée dans un seeder dédié. Grâce à l’attribut de contexte, le seeder suivant reçoit directement l’instance, sans besoin de l’appeler à nouveau ni d’utiliser une requête intermédiaire.

Cependant, cette solution possède aussi des limites potentielles : elle reste spécifique aux scénarios de seeding, et son usage peut introduire un léger temps d’apprentissage, notamment autour des attributs contextuels (ContextAttribute). Il faut également faire attention à ne pas sur-utiliser ce mécanisme pour des cas où une injection directe ou une simple requête suffirait. Enfin, dans les cas très simples, ce niveau d’abstraction peut sembler excessif.

En conclusion, cette fonctionnalité renforce l’architecture des seeders en rendant le partage de contexte explicite, typé et structuré. Elle améliore la clarté, la maintenabilité et permet une meilleure séparation des responsabilités entre les classes. Même si son usage est particulièrement pertinent dans des scénarios complexes, elle doit rester utilisée avec discernement pour ne pas surcharger des seeders simples.

Sources :