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

01

Registro de usuario

El usuario accede a /registro, completa el formulario y la aplicación guarda la cuenta con rol ROLE_USER y contraseña hasheada.

02

Inicio de sesión

El formulario de login autentica al usuario usando el email como identificador. Una vez dentro, el menú cambia y aparecen las opciones privadas.

03

Listado de tareas

La ruta /tareas obtiene todas las tareas desde Doctrine y las muestra en una tabla reutilizable con Twig.

04

Creación de tarea

El usuario accede a /crear-tarea, rellena el formulario TaskType y la tarea se guarda asociada a su cuenta.

05

Edición y borrado

Antes de editar o borrar, el controlador comprueba que el usuario autenticado sea el propietario de la tarea.

06

Vista personal

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.

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.