Contenido del curso
Base de datos
Consultas a tablas
Sistema de inicio de sesión
Gestión de base de datos
Crear y validar snippets en Symfony
Resumen
Publicar contenido propio es el siguiente paso lógico cuando ya tienes registro e inicio de sesión funcionando. Aquí aprenderás a crear un formulario en Symfony que permita a cualquier usuario autenticado guardar fragmentos de código en la base de datos, con validación incluida y una redirección limpia tras el guardado.
¿Cómo se crea un controlador para publicar snippets en Symfony?
Todo arranca generando un controlador dedicado. Desde la terminal ejecutas bin/console make:controller y le pones el nombre SnippetController. Cuando pregunte por PHPUnit, respondes que no. El comando crea dos archivos: el controlador en src y una vista en templates [01:00].
Dentro del controlador renombras la acción a newSnippet. Esta acción será la responsable de recibir los datos del formulario y persistirlos.
¿Qué hace
make:controlleren Symfony? Genera automáticamente un controlador con su ruta y una plantilla Twig asociada, dejándolos listos para que solo edites la lógica.
¿Qué dependencias necesita inyectar la acción?
Para que el método funcione necesitas inyectar varios servicios por argumento. Cada uno cumple una función específica:
- CurrentUser: identifica al usuario que está creando el snippet, tipado como la entidad
User. - EntityManagerInterface: permite persistir el nuevo registro en la base de datos.
- ValidatorInterface: ejecuta las reglas de validación definidas en la entidad.
- Request: da acceso a los datos enviados por el formulario.
Symfony resuelve estas dependencias por autowiring, así que basta con declararlas como parámetros del método [02:30].
¿Cómo se procesa el envío del formulario?
La lógica dentro de newSnippet sigue un patrón claro. Primero capturas todos los datos con $request->request->all() y los guardas en una variable data. Luego preguntas si la solicitud llegó por método POST, porque solo en ese caso debes intentar guardar.
Si es POST, construyes el objeto usando métodos encadenados sobre una nueva instancia de Snippet:
setAuthor($currentUser)asigna al usuario logueado como autor.setTitle($data['title'])toma el título del formulario.setDescription($data['description'])guarda la descripción.setCode($data['code'])almacena el fragmento de código.
Después pasas el objeto al validador. Si no hay errores, ejecutas persist y flush para materializar el registro y rediriges al detalle del snippet usando su slug recién generado [04:15].
¿Para qué sirve el slug en la redirección? El slug es la versión amigable del título usada en la URL. Te permite redirigir directo a la página del snippet creado sin exponer el ID interno.
¿Cómo manejar el caso GET o con errores?
Si la solicitud es GET, o si la validación devolvió errores, retornas la vista con dos variables: los errores y los datos que el usuario ya había escrito. Esto evita que pierda lo tecleado cuando el formulario falla.
La estructura final queda así: captura, validación condicional, persistencia si todo está bien, y render de la plantilla en cualquier otro caso.
¿Cómo se nombran las rutas siguiendo el estándar Symfony?
El nombre de la ruta sigue una convención muy útil para mantener orden. Se compone de tres partes separadas por guion bajo:
- namespace: empieza con
app_indicando que es código de tu aplicación. - controlador: el nombre del controlador, en este caso
snippet. - acción: el método específico, aquí
new.
El resultado es app_snippet_new. Esta nomenclatura te permite identificar de inmediato dónde vive cada ruta cuando revises el código meses después.
¿Cómo se agregan validaciones a la entidad Snippet?
Las reglas de validación viven en la propia entidad, no en el controlador. Abres src/Entity/Snippet.php e importas el namespace Symfony\Component\Validator\Constraints con un alias.
Sobre cada propiedad que quieras validar, agregas el atributo #[Assert\NotBlank]. En el caso del snippet aplicas esta restricción a tres campos:
- Título: no puede ir vacío.
- Descripción: tampoco admite valores en blanco.
- Código: el fragmento es obligatorio.
Cuando el ValidatorInterface recibe el objeto, lee estos atributos y devuelve la lista de errores si algo falla. Esa lista es la que envías a la vista para mostrarla al usuario.
¿Cómo se conecta la plantilla con el formulario?
En la plantilla base agregas un enlace con la función path('app_snippet_new') para llevar al usuario al formulario. Luego copias el bloque HTML del diseño de referencia, lo pegas en new.html.twig y ajustas los campos.
La vista imprime los errores recibidos y vuelve a mostrar los valores previos accediendo a data.title, data.description y data.code. Así el formulario se siente continuo aunque la validación falle varias veces.
Al probar el flujo, si envías el formulario vacío aparecen los mensajes de error. Si llenas todos los campos correctamente, el registro se crea y te redirige al detalle del snippet usando su slug. Como reto, publica un fragmento de código real porque lo vas a necesitar en las próximas clases sobre edición, forks y comentarios. ¿Qué tipo de snippet vas a registrar primero?