Actualizar Spatie Permission 5 a 6: registerPermissions y el namespace de los middleware
Hola, bienvenido. En esta lección vamos a terminar de actualizar Spatie Permission de la versión 5 a la 6, que ya instalamos en la lección anterior y que tiene a los 72 tests de Feature en rojo. Para pasar de Spatie Permission 5 a 6 en un proyecto como este hay que actualizar la migración de sus tablas, quitar las llamadas a registerPermissions() de los tests, cambiar el namespace de los middleware de Middlewares a Middleware y pasar los ids de los roles como enteros.
Vamos a avanzar error a error: lanzar los tests, leer el primer error, resolverlo y volver a lanzarlos. Tenemos a mano la guía de actualización de Spatie Permission (se abre en una pestaña nueva), que para pasar de la versión 5 a la 6 lista 6 cambios, y de esos 6 a nuestro proyecto le afectan 4.
La migración de Spatie: $pivotPermission ya no es estática
Es el error con el que se paraban los 72 tests de Feature en la lección anterior, en la línea 54 de la migración 2023_05_15_100000_create_permission_tables.php. Esa migración no la escribimos nosotros: la publicó Spatie Permission 5 al instalarse, y lee los nombres de las columnas pivote de 2 propiedades estáticas de su PermissionRegistrar, $pivotPermission y $pivotRole. En la versión 6 esas propiedades ya no son estáticas, y la migración no se puede ejecutar.
¿Y por qué no falla en ningún proyecto en producción? Porque esa migración se ejecutó hace tiempo y Laravel no la vuelve a ejecutar. El problema es de cualquier base de datos nueva: la de los tests, que RefreshDatabase crea desde cero, la de alguien que se incorpora al equipo y la de un entorno de pruebas recién creado. La guía de Spatie lo dice en su punto 4, con este mismo error: las migraciones hay que actualizarlas sí o sí, y si no se modificaron, basta con sustituir su contenido por el de la versión nueva, porque la estructura de las tablas no ha cambiado desde la versión 5.
Nuestra migración es la que publicó el paquete, sin cambios, así que vamos a sobrescribirla con la plantilla de la versión 6, que viene en vendor/:
El archivo cambia en varias líneas, pero el cambio que nos afecta es este, que se repite en las 4 tablas pivote:
En la versión 6, la migración lee los nombres de las columnas de config/permission.php, con los mismos valores por defecto, y además usa la sintaxis de clase anónima que introdujo Laravel 8. Las tablas que crea son exactamente las mismas. Si en tu proyecto la migración sí estaba modificada, por ejemplo para utilizar UUID, la solución es la misma, pero aplicando tus cambios sobre la plantilla nueva en vez de copiarla tal cual.
Vamos a lanzar los tests otra vez:
- 02Quitar registerPermissions() de los tests
- 03El namespace de los middleware: de Middlewares a Middleware
- 04"There is no role named 11 for guard web."
- 05La configuración de Spatie Permission 6
- 06Lo que queda en rojo después de Spatie