36 🔑 Evitar Borrar Roles con Usuarios Asociados | Sistema de Parqueo Laravel 12 FullStack
Duración: 10 minDescripción
36 🔑 Índice de Lección: Evitar Borrar Roles con Usuarios Asociados (Laravel 12 FullStack)
La lección 36 aborda un problema crítico de integridad de datos en el sistema: la posibilidad de eliminar un rol que tiene usuarios activos asociados. El objetivo es implementar una validación en el controlador que prevenga la eliminación y mantenga la estabilidad del sistema.
1. Detección del Problema de Integridad
Se demuestra el riesgo que implica permitir la eliminación de roles sin verificación.
- Riesgo 1: Eliminación del Super Administrador: Se muestra que al eliminar el rol Super Admin, el usuario principal pierde inmediatamente todos los permisos, quedando bloqueado del sistema [00:30].
- Riesgo 2: Eliminación de Roles Asociados a Usuarios: Se elimina el rol Operador, el cual estaba asignado a un usuario activo. Al intentar iniciar sesión, el usuario existe, pero como no tiene un rol asignado, pierde todo acceso al dashboard, lo que rompe la experiencia de usuario [03:50].
- Solución Propuesta: Un rol solo debe ser eliminable si no tiene usuarios asociados [04:54].
2. Ajuste de la Vista: Ocultar el Rol "Super Admin"
Como el rol Super Admin es fundamental para el sistema, se decide ocultarlo de la lista de roles que pueden ser editados o eliminados.
- Lógica en roles.index: Se añade una condición con un @if en la vista roles/index.blade.php para que la fila del rol solo se imprima si su nombre ($role->name) es diferente de "Super Admin" [02:15].
- Ajuste de Iteración: Se usa una variable de contador ($contador) de PHP para corregir el índice de la tabla, que se desajusta al ocultar el primer rol [03:00].
- Resultado: El Super Admin ya no aparece en la tabla, lo que evita su eliminación accidental o edición no deseada [03:38].
3. Implementación de la Validación en el Controlador
Se implementa la lógica en el controlador para verificar si el rol tiene usuarios asociados antes de intentar eliminarlo.
- Ubicación: Se trabaja en la función destroy del RoleController [05:37].
- Conteo de Usuarios Asociados:
- Se declara la variable $usuarios_asociados.
- Se utiliza el modelo User y la relación $role->users()->count() para contar cuántos usuarios tienen asignado el rol que se está intentando eliminar [06:16].
- Lógica Condicional (If Statement):
- Se verifica: if ($usuarios_asociados > 0).
- Si es mayor a cero: El sistema retorna a la vista con un mensaje de error (return back()->with('error', ...)) [07:31].
- Mensaje de Error Amigable: El mensaje explica que el rol no puede ser eliminado y muestra el nombre del rol y la cantidad de usuarios asociados (ej., "No se puede eliminar rol Operador porque tiene 1 usuarios asociados") [07:55].
- Si es cero: El código de destroy continúa y elimina el rol de la base de datos [08:54].
- Prueba Final: Se verifica que el sistema permite eliminar roles nuevos (ej., Cajero) que no tienen usuarios, pero bloquea la eliminación de roles como Operador y Administrador [09:30].
Fin del Módulo: Con este ajuste, el módulo de Roles y Permisos queda funcionalmente completo y robusto [10:01].