Novedades en Laravel 10
El 14 de febrero de 2023 fue liberado Laravel 10, la nueva versión de nuestro framework PHP favorito.
En esta entrada te voy a detallar todas las novedades en Laravel 10 para que no te pierdas absolutamente nada de esta nueva versión, empecemos.
Programación de lanzamientos para Laravel
Antes de Laravel 9, las principales versiones del framework se lanzaban dos veces al año, aproximadamente cada seis meses. Con la llegada de Laravel 9, el equipo del framework siguió un cronograma anual, enviando Laravel 9 en febrero de 2022 (en lugar de septiembre de 2021 planeado originalmente).
A continuación tienes un pequeño cronograma de las liberaciones y futuras liberaciones de Laravel:
Laravel 9: 8 de febrero de 2022
Laravel 10: 14 de febrero de 2023
Laravel 11: primer trimestre de 2024
Laravel 9 continuará recibiendo correcciones de errores hasta el 8 de agosto de 2023 y correcciones de seguridad hasta el 14 de febrero de 2024.
Podemos esperar correcciones de errores de Laravel 10 hasta el 6 de agosto de 2024 y correcciones de seguridad hasta el 14 de febrero de 2025.
Ahora que tenemos algo de contexto acerca de las actualizaciones de Laravel Framework, veamos algunas de sus novedades más importantes.
Requisitos para crear un nuevo proyecto en Laravel 10
Para crear un nuevo proyecto con Laravel 10 deberás tener instalado PHP 8.1 o superior, aunque si trabajas con Laravel Sail esto no será un problema. Además de PHP, deberás tener instalado Composer en tu sistema.
Primer proyecto con Laravel 10 y Composer
Después de haber instalado PHP y Composer, puedes crear un nuevo proyecto Laravel 10 utilizando el comando create-project de Composer de la siguiente forma:
Donde laravel-10-project será el nombre de nuestro proyecto.
Si revisas el archivo composer.json tendrás que ver lo siguiente en la clave require:
Primer proyecto con Laravel 10 y el instalador de Laravel
Alternativamente a Composer, podemos instalar y utilizar el instalador de Laravel a través de Composer de la siguiente forma:
Para crear un nuevo proyecto Laravel 10 con el instalador de Laravel sólo deberás ejecutar el siguiente comando:
Con el comando about de artisan podremos ver la información de nuestro proyecto:
Laravel Pennant
Sin duda una gran herramienta para el desarrollo de pruebas A/B. Laravel Pennant nos ayudará al momento de añadir nuevas features (características) a nuestros proyectos Laravel fácilmente, no te pierdas el curso completo de Laravel Pennant.
Nuevo Process Layer
En Laravel hace mucho tiempo que tenemos a nuestra disposición el cliente Http. Una de las novedades en Laravel 10 es la nueva fachada Process, la cual trabaja con la misma API que el cliente Http y nos permitirá hacer cosas como lo siguiente:
Flag --profile en los tests
Con la meta de encontrar los tests que puedan ser más lentos al momento de ejecutar nuestros tests, Laravel 10 nos ofrece el flag --profile:
Gracias a este nuevo flag podremos tener información valiosa acerca de la ejecución de nuestros tests.
Prompts en todos los comandos
En Laravel 10 todos los comandos que requieran de datos son interactivos y nos pedirán toda la información que necesiten, mira el siguiente ejemplo para crear un nuevo controlador en Laravel 10:
Nuevo Helper password en la clase Str
Un nuevo Helper llamado password aparece en Laravel 10, gracias a este nuevo Helper podremos crear contraseñas seguras con una línea de código.
Soporte nativo para modificar columnas
En Laravel 10 ya no es necesario instalar el paquete doctrine/dbal para modificar columnas en MySQL, PostgreSQL y SQL, lo siguiente funcionará sin la necesidad de instalar nada:
Pest scaffolding
En Laravel 10, al momento de crear un nuevo proyecto con el instalador de Laravel, podemos seleccionar tests con Pest de la siguiente forma:
Si todavía no conoces Pest, no te pierdas nuestro curso de refactorización.
Reglas de validación invokables por defecto
Si creamos una regla de validación con Laravel 9 utilizando el siguiente comando:
Veremos el siguiente código en la clase Rule:
Mientras que si hacemos lo mismo en Laravel 10, veremos una clase invokable con el siguiente código:
Tipos nativos en el Skeleton y los paquetes oficiales de Laravel 10
Mientras que en Laravel 9 y sus versiones anteriores todos los tipos estaban definidos con DocBlocks, en Laravel 10 todo tendrá tipos, tanto los datos como los retornos, y los DocBlocks serán eliminados.
Ejemplo controlador en Laravel 9:
Ejemplo controlador en Laravel 10:
Y así será con todo, migraciones, Kernel Http o de Consola etcétera, aquí puedes ver el pull request: [10.x] Uses PHP Native Type Declarations.
Localización
En Laravel 10, el directorio lang que en versiones anteriores aparecía en la raíz del proyecto ya no se incluye por defecto, para que aparezca, es necesario ejecutar el siguiente comando:
Con el comando anterior el directorio lang volverá a estar en su sitio.
Eliminado soporte para Predis v1
Predis v1 dejará de tener soporte en Laravel 10, las opciones que tenemos son utilizar Predis v2 o directamente optar por utilizar la extensión nativa Redis, aquí puedes ver el pull request: [10.x] Drop Predis v1 support.
Actualizar a Laravel 10
Vamos a ver cómo actualizar a Laravel 10. Todo proceso de actualización en Laravel conlleva cierta dificultad, la cual está segmentada en diferentes niveles.
Si estás pensando en actualizar a una versión posterior de tu aplicación Laravel, te recomiendo que consideres Laravel Shift.
Alto impacto
Actualizar dependencias
Actualizar estabilidad mínima
Medio Impacto
Expresiones de base de datos
Propiedad $dates de los modelos
Monolog 3
Etiquetas caché Redis
MocksApplicationServices
El directorio lang
Bajo impacto
Closure en mensajes de reglas de validación
Enlace de la carpeta public
Constructor Illuminate\Database\QueryException
Valores de retorno del Rate Limiter
Relación método getBaseQuery
El método Redirect::home
El método Bus::dispatchNow
El método registerPolicies
Columnas ULID
Actualización de dependencias
Impacto: alto
PHP 8.1.0 Requerido
Laravel ahora requiere PHP 8.1.0 o superior.
Composer 2.2.0 requerido
Laravel ahora requiere Composer 2.2.0 o superior.
Dependencias de Composer
Debes actualizar las siguientes dependencias en el archivo composer.json de tu aplicación:
Opcionalmente, si deseas utilizar PHPUnit 10, debes eliminar el atributo processUncoveredFiles de la sección <coverage>
del archivo de configuración phpunit.xml de tu aplicación. A continuación, actualiza las siguientes dependencias en el archivo composer.json de tu aplicación:
Finalmente, examina cualquier otro paquete de terceros utilizado por tu aplicación y verifica que esté usando la versión adecuada para la compatibilidad con Laravel 10.
Estabilidad mínima
Debes actualizar la configuración de estabilidad mínima en el archivo composer.json de tu aplicación a estable:
Application
Enlace de la carpeta public
Impacto: bajo
Si tu aplicación está personalizando su "ruta pública" vinculando path.public en el contenedor, en su lugar, debes actualizar tu código para invocar el método usePublicPath ofrecido por el objeto Illuminate\Foundation\Application:
Authorization
El método registerPolicies
Impacto: bajo
Laravel 10 ahora invoca automáticamente el método registerPolicies del AuthServiceProvider. Por lo tanto, puedes eliminar la llamada a este método desde el método de boot
del AuthServiceProvider de tu aplicación.
Cache
Etiquetas caché Redis
Impacto: medio
La compatibilidad con las etiquetas de caché de Redis se ha reescrito para mejorar el rendimiento y la eficiencia del almacenamiento. En versiones anteriores de Laravel, las etiquetas de caché obsoletas se acumulaban en el caché al usar Redis como controlador de caché de tu aplicación. Sin embargo, para purgar correctamente las entradas de etiquetas de caché obsoletas, el nuevo comando Artisan de Laravel cache:prune-stale-tags
debe programarse en la clase App\Console\Kernel
de tu aplicación:
Base de datos
Expresiones de base de datos (Métodos raw)
Impacto: medio
Las "expresiones" de la base de datos (generalmente generadas a través de DB::raw
) se han reescrito en Laravel 10.x para ofrecer funcionalidad adicional en el futuro. En particular, el valor de cadena sin procesar de la gramática ahora debe recuperarse a través del método getValue (Grammar $grammar) de la expresión. Ya no se admite la conversión de una expresión a una cadena usando (cadena).
Normalmente, esto no afecta a las aplicaciones de usuario final; sin embargo, si tu aplicación convierte manualmente expresiones de base de datos en cadenas usando (string)
o invocando el método __toString
en la expresión directamente, deberás actualizar tu código para invocar el método getValue en su lugar:
Constructor Illuminate\Database\QueryException
Impacto: bajo
El constructor Illuminate\Database\QueryException ahora acepta un nombre de conexión de cadena como su primer argumento. Si tu aplicación lanza manualmente esta excepción, debes ajustar su código en consecuencia.
Columnas ULID
Impacto: bajo
Cuando las migraciones invoquen el método ulid sin ningún argumento, la columna ahora se llamará ulid. En versiones anteriores de Laravel, al invocar este método sin ningún argumento se creaba una columna con el nombre erróneo de uuid:
Para especificar explícitamente un nombre de columna al invocar el método ulid, puedes pasar el nombre de la columna al método:
Eloquent
Propiedad $dates
Impacto: medio
Se ha eliminado la propiedad obsoleta $dates de los modelos Eloquent. Tu aplicación ahora debería usar la propiedad $casts:
Relación método getBaseQuery
Impacto: bajo
El método getBaseQuery en la clase Illuminate\Database\Eloquent\Relations\Relation ha cambiado de nombre a toBase.
Localización
El directorio lang
Impacto: ninguno
Aunque no es relevante para las aplicaciones existentes, el esqueleto de la aplicación Laravel ya no contiene el directorio lang de forma predeterminada. En cambio, al escribir nuevas aplicaciones de Laravel, se pueden publicar usando el comando lang:publish de Artisan:
Logging
Monolog 3
Impacto: medio
La dependencia Monolog de Laravel se ha actualizado a Monolog 3.x. Si estás interactuando directamente con Monolog dentro de tu aplicación, debes revisar la guía de actualización de Monolog. Si estás utilizando servicios de registro de terceros, como BugSnag o Rollbar, es posible que debas actualizar esos paquetes de terceros a una versión compatible con Monolog 3.x y Laravel 10.x.
Queues
El método Bus::dispatchNow
Impacto: bajo
Los métodos obsoletos Bus::dispatchNow y dispatch_now se han eliminado. En su lugar, tu aplicación debe usar los métodos Bus::dispatchSync y dispatch_sync, respectivamente.
Routing
Middleware Alias
Impacto: opcional
En las nuevas aplicaciones de Laravel, la propiedad $routeMiddleware
de la clase App\Http\Kernel
ha sido renombrada a $middlewareAliases
para reflejar mejor su propósito. Laravel nos propone cambiar el nombre de esta propiedad en nuestras aplicaciones existentes; sin embargo, no es necesario.
Valores de retorno del Rate Limiter
Impacto: bajo
Al invocar el método RateLimiter::attempt
, el método devolverá el valor devuelto por el cierre proporcionado. Si no se devuelve nada o null
, el método attempt
devolverá true:
El método Redirect::home
Impacto: bajo
Se eliminó el método obsoleto Redirect::home. En su lugar, tu aplicación debe redirigir a una ruta nombrada explícitamente:
Testing
MocksApplicationServices
Impacto: medio
El trait obsoleto MocksApplicationServices ha sido eliminado en Laravel 10. Este trait exponía métodos de testing como expectsEvents, expectsJobs y expectsNotifications. Si tu aplicación utiliza estos métodos, la recomendación es que realices la transición a Event::fake, Bus::fake y Notification::fake, respectivamente. Puedes obtener más información sobre MocksApplicationServices a través de fakes en la documentación correspondiente del componente que estás intentando falsear.
Validación
Closure en mensajes de reglas de validación
Impacto: bajo
Al escribir reglas de validación personalizadas basadas en el cierre, el invocar a $fail más de una vez ahora agregará los mensajes a una matriz en lugar de sobrescribir el mensaje anterior. Por lo general, esto no afectará tu aplicación. Además, la closure $fail ahora devuelve un objeto. Si anteriormente estabas indicando el tipo de devolución de su closure, esto puede requerir que actualices su tipo:
¿Debo actualizar a Laravel 10?
No es necesario actualizar a Laravel 10 a no ser que la nueva versión tenga alguna característica que realmente sea interesante para nuestro proyecto, como por ejemplo Laravel Pennant.
Un buen motivo para querer actualizar es que deseemos utilizar algún paquete que sólo soporte Laravel 10.
Ten en cuenta que Laravel 9 sigue en plena forma:
Corrección de errores hasta el 8 de agosto de 2023
Correcciones de seguridad hasta el 6 de febrero de 2024
Crear un nuevo proyecto con Laravel 11
La próxima versión de Laravel ya puede ser instalada en nuestro equipo. Para crear un nuevo proyecto con Laravel 11, podemos hacer lo siguiente:
Estas son muchas de las novedades en Laravel 10, espero que te hayan ayudado a conocer lo que tenemos disponible en esta nueva versión de Laravel para llevar tus proyectos al siguiente nivel.
Si quieres desarrollar tu primera aplicación con Laravel 10, ¡no te pierdas el curso de Laravel 10!