Cómo insertar datos de prueba con ORM Fixtures en Symfony

Clase 8 de 20Curso de Symfony

Resumen

Al arrancar un proyecto Symfony que utiliza Doctrine ORM, es esencial contar con datos iniciales para las pruebas y el desarrollo. Aquí aprenderás, paso a paso, cómo insertar usuarios, fragmentos de código y comentarios en tu base de datos, aplicando además las mejores prácticas de encriptación de contraseñas en Symfony.

¿Cómo instalar y preparar generadores de datos iniciales en Symfony?

Primero es crucial instalar el componente adecuado para insertar datos falsos en la base de datos. Utilizando Composer, el comando clave es:

composer require orm-fixtures

Esto descarga la herramienta necesaria y crea una carpeta donde podrás organizar tus archivos de carga de datos. Así tendrás el espacio de trabajo listo para iniciar con la generación de datos de prueba.

¿Cómo crear un usuario de prueba y encriptar su contraseña en Symfony?

Para insertar un usuario, se crea un objeto de la entidad correspondiente y se configuran nombre, correo y contraseña. Por ejemplo:

$user = new User();
$user->setName('test user');
$user->setEmail('i@test.com');
$user->setPassword('password');

Sin embargo, Symfony recomienda nunca guardar contraseñas en texto plano en producción. Es necesario inyectar la interfaz de encriptación de contraseñas y usar su método específico:

private UserPasswordHasherInterface $passwordHasher;

$hashedPassword = $this->passwordHasher->hashPassword($user, 'password');
$user->setPassword($hashedPassword);

Persistir guarda el objeto preparado en una "cola" y, al usar flush, se insertan los datos en la base real. Recuerda responder afirmativamente si el sistema pregunta por confirmación en entorno de pruebas.

¿Cómo insertar fragmentos de código y asociar relaciones entre entidades?

Para poblar otras tablas, como fragmentos de código (snippets), repite el proceso. Crea y configura nuevos objetos para cada fragmento, asignando título, descripción y el código:

$snippet1 = new Snippet();
$snippet1->setTitle('...');
$snippet1->setDescription('...');
$snippet1->setCode('...');
$snippet1->setAuthor($user);

Para asociar relaciones, como un fragmento "hijo" de otro, utiliza setParent:

$snippet3->setParent($snippet1);

Todos estos objetos se enlazan a una entidad de usuario existente y pueden ser registrados con persist y flush.

¿Cómo agregar comentarios enlazados a usuarios y fragmentos de código?

La creación de comentarios sigue el mismo patrón. Así se vinculan usuarios y fragmentos de código:

$comment1 = new Comment();
$comment1->setContent('...');
$comment1->setSnippet($snippet1);
$comment1->setUser($user);

Una vez creados y enlazados todos los objetos necesarios (usuarios, fragmentos, comentarios), asegúrate de agregarlos a la "cola" de persistencia antes de llamar a flush para almacenarlos en la base de datos.

¿Qué estructura final tienen los datos cargados y cuál es el reto propuesto?

Después de estos pasos, la base de datos contiene:

  • Un usuario registrado con contraseña encriptada.
  • Tres fragmentos de código, uno de ellos con referencia a un "padre".
  • Dos comentarios, cada uno relacionado con un usuario y un fragmento.

El reto consiste en escalar la inserción a diez usuarios, cincuenta fragmentos de código y cien comentarios. Así tendrás una base sólida y realista para avanzar en el desarrollo y pruebas de tu proyecto. ¿Te animas a intentarlo y compartir tu resultado?