
Context de Laravel en seeders: intercambio limpio de datos entre seeders de bases de datos
- Publicado el 19 agosto, 2025
- Palabras: 241
Los seeders de bases de datos suelen necesitar compartir los registros creados, pero los enfoques tradicionales generan código desordenado y un acoplamiento estrecho. El Context de Laravel ofrece una solución clara para el flujo de datos del seeder.

Al crear seeders de bases de datos complejos, es frecuente encontrar escenarios en los que los seeders posteriores necesitan acceder a registros creados por los anteriores. Las soluciones tradicionales implican propiedades estáticas, variables globales o la repetición de consultas a la base de datos, lo cual genera problemas de mantenimiento y dependencias confusas entre los seeders.
El sistema Context de Laravel transforma este desafío al proporcionar una forma limpia y con seguridad de tipos para compartir datos entre seeders. En lugar de contaminar las clases de los seeders con propiedades estáticas o forzar consultas innecesarias a la base de datos, Context actúa como un bus de datos ligero que mantiene una clara separación de tareas y permite un flujo de datos fluido.
#Ejemplo práctico
Considere una aplicación de comercio electrónico donde necesita crear usuarios, luego crear canales y, finalmente, establecer relaciones entre ellos. Así es como Context elimina la complejidad:
use App\Models\User;
use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\Context;
class UserSeeder extends Seeder
{
public function run(): void
{
$user = User::factory()->create([
'email' => 'admin@example.com',
'role' => 'admin'
]);
Context::add('user', $user);
Context::add('admin_email', $user->email);
}
}
use App\Models\Channel;
use App\Models\User;
use Illuminate\Container\Attributes\Context;
use Illuminate\Database\Seeder;
class ChannelSeeder extends Seeder
{
public function run(
// Retrieve context data with type-hinting
#[Context('user')] User $user,
): void {
$channel = Channel::factory()->create([
'name' => 'General Discussion',
'created_by' => $user->id
]);
$channel->users()->attach($user, ['role' => 'moderator']);
Context::add('main_channel', $channel);
}
}
Este enfoque elimina varios antipatrones comunes: se eliminan las consultas User::where('email', 'admin@example.com')->first() en seeders dependientes, las propiedades estáticas no sobrecargan las clases de seeders y el acoplamiento estrecho entre seeders dificulta las pruebas.
El sistema de Context también proporciona seguridad de tipos mediante el atributo #[Context], lo que garantiza que el IDE pueda proporcionar un autocompletado adecuado y que el código se mantenga mantenible a medida que la lógica de seeder se vuelve más compleja. Esto crea un patrón limpio de inyección de dependencias que hace que las relaciones entre seeders sean explícitas y comprobables.

Desarrollador backend especializado en PHP y Laravel, con sede en Santander, Cantabria. Más de 15 años de experiencia en el desarrollo de aplicaciones web a medida y en la modernización de código heredado.
Fuente: Harris Raftopoulos
Artículos relacionados
Inicia la conversación
Hazte miembro de Antonio Jenaro para comenzar a comentar.
Regístrate ahora¿Ya estás registrado? Inicia sesión