Laravel 8 ¡Ya está aquí! Novedades

Finalmente llegamos al 8 de Septiembre y tenemos disponible la nueva versión mayor de uno de los mejores frameworks de PHP y en este artículo te comentare todas las novedades de Laravel 8.

¿Qué pasa con Laravel 7, 6 y versiones anteriores?

Si tienes proyectos con Laravel 7 o 6 todavía tienes tiempo de actualizarlos a Laravel 8. Laravel 7 tendrá soporte de correcciones de errores hasta el 10 de septiembre de 2020 y correcciones de seguridad hasta el 3 de marzo de 2021.

Por otro lado, Laravel 6 es la versión LTS hasta la fecha. Esto quiere decir que se continuará brindando soporte para la corrección de errores hasta el 3 de Septiembre del 2021 y problemas de seguridad hasta el 3 de Septiembre del 2022.

Versiones anteriores a la versión 6 quedaron fuera de soporte oficial. Te recomendaría que te des un tiempito para actualizar tus proyectos, aunque sea a Laravel 6, y dejar de acumular deuda técnica.

Nuevas características de Laravel 8

Laravel 8 viene con varias características que sin duda mejorarán la velocidad que desarrollamos proyectos, como así también, la calidad de los mismos.

Nombremos cada una de las nuevas características y luego entraremos en detalle:

  • Laravel Jetstream.
  • Carpeta para los Modelos.
  • Clases para Factories.
  • Squashing de migraciones.
  • Jobs por lotes.
  • Rate limit mejorado.
  • Modo de mantenimiento mejorado.
  • Time testing helpers.
  • Paginación con Tailwind por defecto.

Laravel Jetstream

Laravel Jetstream

Laravel Jetstream nos permite crear un nuevo proyecto de Laravel con todo lo básico que tiene cualquier proyecto web: inicio de sesión, registración de usuarios, verificación de correo electrónico y hasta autenticación de dos pasos.

También incluye Laravel Sanctum para realizar tus APIs y una nueva excelente característica como es la administración de roles y permisos de forma integrada. 

Por el lado del frontend, Laravel Jetstream integra Tailwind CSS y la posibilidad de instalar automáticamente Livewire o Inercia en nuestro proyecto.

Cabe decir que todas las características son opcionales y Jetstream nos dará la opción para instalar las que deseemos. También, tiene un archivo de configuración para habilitar o deshabilitar las características que queramos.

Viene con un dashboard como pagina principal de tu proyecto que podes usar como punto de partida para crear nuevas vistas.

También viene con toda la lógica para las fotos de perfil de tus usuarios y te olvidas de desarrollar esta característica que es tan común en todos los proyectos web.

Te dejo la documentación de Laravel Jetstream para que veas con más detalle todas sus features.

Carpeta para los Modelos

Esto es algo que parece que Tailor no termina de decidirse. Y por eso hizo una encuesta en Twitter para saber si las personas crean una carpeta Models/ para poner todos sus modelos o no. Y la mayoría voto que así era. Por lo tanto, en Laravel 8 vuelva la carpeta Models/ que se había sacado en versiones anteriores de Laravel.

Se actualizaron todos los comando de Laravel que crean modelos para que se creen los archivos en app/Models/ por defecto.

Clases para Factories

Hasta Laravel 7.x las Factories eran un archivo plano de php donde teníamos un objeto $factory inyecto de una forma mágica y, a través de él, desarrollábamos nuestra factory.

Ahora, las fabricas se reescribieron totalmente y se basan en clases en lugar de un simple archivo php. Ahora tendrán el siguiente aspecto.

<?php

namespace Database\Factories;

use App\Models\User;
use Illuminate\Database\Eloquent\Factories\Factory;
use Illuminate\Support\Str;

class UserFactory extends Factory
{
    /**
     * The name of the factory's corresponding model.
     *
     * @var string
     */
    protected $model = User::class;

    /**
     * Define the model's default state.
     *
     * @return array
     */
    public function definition()
    {
        return [
            'name' => $this->faker->name,
            'email' => $this->faker->unique()->safeEmail,
            'email_verified_at' => now(),
            'password' => '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', // password
            'remember_token' => Str::random(10),
        ];
    }
}

Ahora que las factories son clases de PHP vamos a poder agregar métodos a nuestras clases para una mejor organización. Como así también, utilizar clases externas para darle mas «superpodes» a nuestras factories.

También se creo Laravel Legacy Factories para brindar soporte para la generación de fábricas de versiones anteriores de Laravel (<= 7.x) para Laravel 8.x.

Squashing de migraciones

Es muy común que en nuestros proyectos tengamos muchos archivos de migraciones. Por eso, Laravel 8 integra el comando schema:dump para integrar todas las migraciones en único archivo SQL.

Cuando ejecutes schema:dump, Laravel generará un archivo «schema» en la carpeta database/schema. Ahora, cuando intentes migrar tu base de datos y no se hayan ejecutado otras migraciones, Laravel ejecutará primero el SQL del archivo de schema. Después de ejecutar los comandos del archivo, Laravel ejecutará las migraciones restantes que no estaban en el archivo schema.

Jobs por lotes

Ahora Laravel nos permitirá ejecutar un lote de jobs y luego realizar alguna acción cuando el lote se haya completado. Por ejemplo:

use App\Jobs\ProcessPodcast;
use App\Podcast;
use Illuminate\Bus\Batch;
use Illuminate\Support\Facades\Batch;
use Throwable;

$batch = Bus::batch([
    new ProcessPodcast(Podcast::find(1)),
    new ProcessPodcast(Podcast::find(2)),
    new ProcessPodcast(Podcast::find(3)),
    new ProcessPodcast(Podcast::find(4)),
    new ProcessPodcast(Podcast::find(5)),
])->then(function (Batch $batch) {
    // All jobs completed successfully...
})->catch(function (Batch $batch, Throwable $e) {
    // First batch job failure detected...
})->finally(function (Batch $batch) {
    // The batch has finished executing...
})->dispatch();

return $batch->id;

Rate limit mejorado

La limitación de requests de Laravel se ha mejorado con más flexibilidad y potencia, manteniendo la compatibilidad con versiones anteriores.

Ahora tenemos la fachada RateLimiter con el método for()que nos permite distintas características. Por ejemplo, podríamos limitar la cantidad de request por minuto a un endpoint en particular, de la siguiente forma.

use Illuminate\Cache\RateLimiting\Limit;
use Illuminate\Support\Facades\RateLimiter;

RateLimiter::for('global', function (Request $request) {
    return Limit::perMinute(1000);
});

Hasta podríamos agregar una condición para limitar las descargas de un archivo, por ejemplo.

RateLimiter::for('download-pay-file', function (Request $request) {
    return $request->user()->vipCustomer()
                ? Limit::none()
                : Limit::perMinute(100);
});

Y también podríamos limitar a un usuario por su IP:

RateLimiter::for('download-pay-file', function (Request $request) {
    return $request->user()->vipCustomer()
                ? Limit::none()
                : Limit::perMinute(100)->by($request->ip());
});

Modo de mantenimiento mejorado

En versiones anteriores de Laravel, el comando php artisan down permitia habilitar el acceso a la aplicación especificando una «lista blanca» de direcciones IP. Esta característica se ha eliminado en favor de una solución más simple a base de «tokens».

Ahora podes usar la opción secret para especificar un token de omisión del modo de mantenimiento:

php artisan down --secret="1630542a-246b-4b66-afa1-dd72a4c43515"

Después de colocar la aplicación en modo de mantenimiento, puede navegar a la URL de la aplicación que coincide con este token y Laravel emitirá una cookie de omisión del modo de mantenimiento a su navegador:

https://example.com/1630542a-246b-4b66-afa1-dd72a4c43515

Al acceder a esta ruta oculta, será redirigido a la ruta / de tu aplicación. Una vez que la cookie haya sido enviada a su navegador, podrá navegar por la aplicación normalmente como si no estuviera en modo de mantenimiento. 

Time testing helpers

Siempre es todo un tema el testing cuando tenemos horas involucradas. Por eso, Laravel 8 viene con distintas funciones para ayudarnos a manipular la hora actual. A continuación dejo varios ejemplos.

public function testTimeCanBeManipulated()
{
    // Ir al futuro...
    $this->travel(5)->milliseconds();
    $this->travel(5)->seconds();
    $this->travel(5)->minutes();
    $this->travel(5)->hours();
    $this->travel(5)->days();
    $this->travel(5)->weeks();
    $this->travel(5)->years();

    // Ir al pasado...
    $this->travel(-5)->hours();

    // Ir a una hora especifica...
    $this->travelTo(now()->subHours(6));

    // Volver al presente...
    $this->travelBack();
}

Paginación con Tailwind

El paginador de Laravel se ha actualizado para utilizar el framework CSS Tailwind de forma predeterminada. Igualmente, no te preocupes porque las vistas con Bootstrap 3 y 4 siguen disponibles.

Migración a Laravel 8

La migración a Laravel 8 es bastante simple y, según la documentación de Laravel, lleva al rededor de 15 minutos.

También debes tener en cuenta que Laravel 8 funciona con PHP 7.3 en adelante. Así que es algo ha tener en consideración para los paquetes de terceros que hayas instalado en tu proyecto.

Te dejo la documentación oficial para actualizar a Laravel https://laravel.com/docs/8.x/upgrade