Caso de estudio
CRUD Symfony para gestión de tareas
Este proyecto es una aplicación web desarrollada con Symfony para gestionar tareas de usuarios registrados. La aplicación permite crear cuentas, iniciar sesión y trabajar con un sistema CRUD completo sobre la entidad Task: listar tareas, ver el detalle, crear nuevas tareas, editar tareas propias y eliminarlas.
El proyecto aplica una estructura clásica MVC: controladores para la lógica de petición, entidades Doctrine para el modelo de datos, formularios Symfony para capturar información, plantillas Twig para renderizar la interfaz y configuración de seguridad para restringir las acciones privadas a usuarios autenticados.
CRUD completo
Login y registro
Tareas por usuario
Doctrine + Twig
2 entidades
User y Task relacionadas con Doctrine
CRUD
crear, listar, consultar, editar y borrar tareas
Auth
registro, login, logout y rutas protegidas por rol
Twig
plantillas reutilizables para layout, tablas y formularios
Problema / reto
Construir una aplicación real con Symfony, usuarios y tareas relacionadas
El reto del proyecto era crear una aplicación funcional de gestión de tareas, no solo una maqueta. Para ello era necesario conectar varias piezas importantes del framework: rutas, controladores, entidades, repositorios, formularios, validaciones, seguridad y vistas.
- Crear una entidad
User capaz de autenticarse con email y contraseña.
- Crear una entidad
Task con título, contenido, prioridad, horas y fecha de creación.
- Relacionar cada tarea con su usuario mediante una relación
ManyToOne.
- Permitir que los usuarios creen, editen y borren únicamente sus propias tareas.
- Proteger las rutas del CRUD para que solo sean accesibles por usuarios autenticados.
- Renderizar la información con Twig y reutilizar componentes como el listado de tareas.
- Persistir los datos con Doctrine ORM y una base de datos relacional.
Solución
Una aplicación MVC con Symfony, Doctrine, Twig y Security
La solución se apoya en la estructura estándar de Symfony. El controlador de tareas centraliza las acciones del CRUD, el controlador de usuarios gestiona registro e inicio de sesión, Doctrine se encarga de mapear entidades a tablas y Twig renderiza la interfaz.
TaskController gestiona listado, detalle, creación, edición, borrado y tareas personales.
UserController gestiona registro de usuarios y login.
TaskType define el formulario para crear y editar tareas.
RegisterType define el formulario de alta de usuario.
security.yaml define el proveedor de usuarios, formulario de login y rutas protegidas.
Planteamiento
Gestión de tareas con permisos por propietario
Una parte importante del proyecto es que no todos los usuarios pueden modificar cualquier tarea. La aplicación comprueba que el usuario autenticado coincida con el propietario de la tarea antes de permitir editarla o borrarla.
- El listado general muestra las tareas existentes.
- La vista “Mis tareas” filtra las tareas asociadas al usuario autenticado.
- Las acciones de edición y borrado se muestran solo para el propietario.
- El controlador vuelve a validar el propietario antes de ejecutar cambios.
- Las rutas privadas exigen
ROLE_USER.
Arquitectura
Estructura principal del proyecto Symfony
La aplicación está organizada siguiendo la separación habitual de Symfony: configuración en config, controladores en src/Controller, entidades en src/Entity, formularios en src/Form, repositorios en src/Repository y vistas en templates.
symfony/
├── config/
│ ├── routes.yaml → rutas principales del CRUD y autenticación
│ ├── services.yaml → autowire y autoconfigure de servicios
│ └── packages/
│ ├── doctrine.yaml → conexión y mapeo ORM de entidades
│ ├── security.yaml → login, proveedor de usuarios y access_control
│ ├── twig.yaml → configuración de plantillas
│ ├── validator.yaml → validación de formularios y entidades
│ └── monolog.yaml → logs por entorno
│
├── src/
│ ├── Controller/
│ │ ├── TaskController.php → CRUD de tareas
│ │ └── UserController.php → registro y login
│ │
│ ├── Entity/
│ │ ├── Task.php → tarea, prioridad, horas, contenido y usuario
│ │ └── User.php → usuario autenticable y colección de tareas
│ │
│ ├── Form/
│ │ ├── TaskType.php → formulario de tarea
│ │ └── RegisterType.php → formulario de registro
│ │
│ └── Repository/
│ ├── TaskRepository.php → repositorio Doctrine de tareas
│ └── UserRepository.php → repositorio Doctrine de usuarios
│
└── templates/
├── base.html.twig → layout principal y menú según sesión
├── includes/task-list.html.twig → tabla reutilizable de tareas
├── task/
│ ├── index.html.twig → listado general
│ ├── my-tasks.html.twig → tareas del usuario
│ ├── detail.html.twig → detalle de tarea
│ └── creation.html.twig → crear y editar tarea
└── user/
├── login.html.twig → formulario de acceso
└── register.html.twig → formulario de registro
El flujo principal queda separado de forma clara: las rutas apuntan a controladores, los controladores usan formularios y Doctrine, las entidades representan el modelo de datos y Twig se encarga de la salida HTML.
Módulos principales
Componentes que forman la aplicación
El proyecto está compuesto por varias piezas conectadas entre sí:
TaskController::index obtiene todas las tareas ordenadas por ID descendente.
TaskController::detail muestra una tarea concreta mediante param converter de Symfony.
TaskController::creation crea tareas y las asocia al usuario autenticado.
TaskController::myTasks recupera la colección de tareas del usuario actual.
TaskController::edit reutiliza el formulario de creación para modificar tareas existentes.
TaskController::delete elimina tareas después de comprobar la propiedad.
UserController::register crea usuarios, asigna rol y hashea la contraseña.
UserController::login muestra errores de autenticación y último email introducido.
Seguridad y usuarios
Login, registro y rutas protegidas
La aplicación utiliza el componente de seguridad de Symfony. El usuario se carga desde la entidad User usando el email como identificador y la contraseña se almacena mediante hash.
- Proveedor de usuarios basado en
App\Entity\User.
- Login mediante formulario en la ruta
/.
- Logout en
/logout con redirección al inicio.
- Rutas de tareas protegidas con
ROLE_USER.
- Menú dinámico en Twig según exista o no
app.user.
Modelo de datos
Usuarios y tareas relacionados con Doctrine
El modelo se compone de una relación entre usuarios y tareas. Un usuario puede tener muchas tareas, y cada tarea pertenece a un usuario.
- User: nombre, apellidos, email, contraseña, rol, fecha de creación y colección de tareas.
- Task: título, contenido, prioridad, horas, fecha de creación y usuario propietario.
- Relación:
User OneToMany Task y Task ManyToOne User.
- Repositorios: clases dedicadas para futuras consultas personalizadas.
Formularios y validación
Captura de datos con Symfony Forms
La creación de usuarios y tareas se realiza mediante formularios Symfony. Esto permite centralizar los campos, tipos de entrada y botones de envío en clases reutilizables.
RegisterType incluye nombre, apellidos, email, contraseña y botón de registro.
TaskType incluye título, contenido, prioridad, horas presupuestadas y botón de guardar.
- La entidad
User utiliza validaciones como NotBlank, Email y Regex.
- Los formularios se renderizan en Twig con
form_start, form_widget y form_end.
Proceso
Cómo funciona el CRUD de principio a fin
El usuario accede a /registro, completa el formulario y la aplicación guarda la cuenta con rol ROLE_USER y contraseña hasheada.
El formulario de login autentica al usuario usando el email como identificador. Una vez dentro, el menú cambia y aparecen las opciones privadas.
La ruta /tareas obtiene todas las tareas desde Doctrine y las muestra en una tabla reutilizable con Twig.
El usuario accede a /crear-tarea, rellena el formulario TaskType y la tarea se guarda asociada a su cuenta.
Antes de editar o borrar, el controlador comprueba que el usuario autenticado sea el propietario de la tarea.
La ruta /mis-tareas muestra únicamente la colección de tareas del usuario actual.
Fortalezas
Qué demuestra este proyecto
- Uso práctico de Symfony en una aplicación CRUD completa.
- Comprensión del patrón MVC aplicado a un caso real.
- Gestión de entidades y relaciones con Doctrine ORM.
- Creación y procesamiento de formularios Symfony.
- Autenticación con Security Bundle y contraseñas hasheadas.
- Control de permisos para editar o borrar solo recursos propios.
- Reutilización de plantillas Twig para layout y listados.
Mejoras futuras
Evolución natural de la aplicación
- Añadir paginación y filtros por prioridad o usuario.
- Incluir mensajes flash al crear, editar o borrar tareas.
- Añadir CSRF explícito en acciones de borrado.
- Corregir textos con codificación incorrecta en algunas plantillas.
- Crear fixtures para datos de prueba.
- Añadir tests funcionales sobre login y CRUD.
- Mejorar diseño visual de formularios y tablas.
Resultado
Una aplicación Symfony funcional para gestionar tareas con usuarios
El resultado es una aplicación web completa de gestión de tareas donde cada usuario puede registrarse, iniciar sesión, crear tareas, ver sus tareas, consultar detalles, editar contenido y borrar registros propios.
Como proyecto de portfolio, muestra dominio de las bases importantes de Symfony: rutas, controladores, entidades Doctrine, relaciones, formularios, validaciones, seguridad, plantillas Twig y persistencia en base de datos.
Galería
Capturas y vistas de la aplicación
Login, el registro, el listado de tareas, el formulario de creación/edición y el detalle de una tarea.
Pantalla de login con autenticación por email y contraseña.
Listado de tareas renderizado con Twig y acciones de ver, editar o borrar.
Formulario Symfony para crear o editar tareas con prioridad y horas presupuestadas.
Contacto
¿Quieres ver más proyectos con Symfony, PHP o backend?
Puedo enseñarte más desarrollos con Symfony, WordPress, PrestaShop, scraping, automatización e integraciones reales.