06 Módulo Usuarios CRUD Completo Paso a Paso en Laravel Sistema Odontológico Clinica Dental

Duración: 32 min
Módulo: Módulo de Gestión de Pacientes (CRUD Completo) Lección 1 de 4

Descripción

🎓 Lección 06: Módulo de Usuarios, CRUD Completo y Asignación de Roles en Laravel

Objetivo General: Implementar la gestión integral de usuarios (Creación, Lectura, Actualización y Eliminación) en Laravel para un sistema odontológico, integrando control de estados (enum), sembradores de datos (Seeders), encriptación segura de contraseñas y asignación dinámica de roles mediante la librería Spatie.

🚀 Pasos Clave con Timestamps

  • 📌 Modificación de la Migración de Usuarios: Incorporación del campo estado de tipo enum ('activo', 'inactivo') en la migración nativa de la tabla users para controlar el acceso al sistema, seguido del refresco de la base de datos. ⏱️ 02:11
  • 📌 Creación del Seeder de Roles: Generación de la clase RollSeeder para automatizar la inserción de los roles iniciales del sistema (superadministrador, admin, doctor, paciente, secretaria). ⏱️ 07:26
  • 📌 Siembra de Usuario Base y Contraseña Hash: Configuración del DatabaseSeeder para registrar el usuario principal utilizando Hash::make() para proteger las credenciales en la base de datos. ⏱️ 08:05
  • 📌 Integración del Trait HasRoles de Spatie: Inclusión de use HasRoles; dentro del modelo User para habilitar los métodos de asignación y sincronización de roles en la tabla pivote model_has_roles. ⏱️ 14:04
  • 📌 Generación del Controlador de Recursos: Creación de UserController mediante el comando make:controller con la bandera -r para incluir la estructura estándar de funciones CRUD. ⏱️ 17:00
  • 📌 Definición de Rutas HTTP: Registro de los endpoints principales dentro de routes/web.php para apuntar a cada uno de los métodos del controlador de usuarios. ⏱️ 17:31
  • 📌 Construcción de la Vista e Interfaz de Búsqueda: Elaboración del archivo index.blade.php con tabla responsiva, paginación de 10 en 10 y buscador dinámico por nombre o correo electrónico. ⏱️ 19:04
  • 📌 Almacenamiento y Sincronización de Rol (store): Implementación de la lógica en el controlador con validación de campos obligatorios, correos únicos y vinculación inmediata del rol seleccionado con $user->assignRole(). ⏱️ 21:26
  • 📌 Edición y Actualización Condicional de Contraseña (update): Creación del método de actualización que permite cambiar datos del usuario y rol asignado sin exigir reescribir la clave si se deja en blanco. ⏱️ 23:08
  • 📌 Eliminación y Desvinculación Automática (destroy): Procesamiento de la baja de usuario mediante el método de eliminación y verificación de la remoción automática de sus registros en la tabla pivote. ⏱️ 24:28

🛠️ Comandos y Rutas Principales

Tipo / CategoríaComando Artisan / Ruta HTTPMétodo / AcciónDescripción de la Tarea
💻 Terminal Artisanphp artisan migrate:fresh --seedCLIReinicia las migraciones y ejecuta los Seeders para poblar datos base.
💻 Terminal Artisanphp artisan make:seeder RollSeederCLIGenera el archivo sembrador para los roles iniciales.
💻 Terminal Artisanphp artisan make:controller UserController -rCLICrea el controlador de recursos para el CRUD de usuarios.
🌐 Ruta HTTP/admin/usuariosGET (index)Muestra la vista principal con el listado y buscador de usuarios.
🌐 Ruta HTTP/admin/usuariosPOST (store)Recibe, valida y almacena los datos de un nuevo usuario.
🌐 Ruta HTTP/admin/usuarios/{id}PUT (update)Modifica la información, rol o estado del usuario seleccionado.
🌐 Ruta HTTP/admin/usuarios/{id}DELETE (destroy)Remueve el registro del usuario en la base de datos.

🔒 Buenas Prácticas y Seguridad

  1. 🔐 Encriptación de Contraseñas: Encriptar siempre la contraseña del usuario antes de guardarla en la base de datos utilizando el facade Hash::make().
  2. 🛡️ Actualización Condicional de Password: Permitir que el campo de contraseña sea opcional durante la actualización (nullable), de modo que el perfil pueda modificarse sin sobrescribir el hash existente de manera no deseada.
  3. 🚫 Protección del Rol Superadministrador: Excluir el rol de superadministrador en los selectores de formularios de registro y edición para impedir la creación innecesaria de múltiples usuarios con privilegios globales.
  4. Sincronización Limpia de Tablas Pivote: Utilizar el método syncRoles() de Spatie para garantizar que la relación entre usuario y rol en model_has_roles se actualice de forma atómica y sin generar datos huérfanos.