Release Notes

# Esquema de versiones

Laravel y sus otros paquetes de primera mano siguen el Semantic Versioning. Las liberaciones de marcos mayores se liberan cada seis meses (~marzo y ~septiembre), mientras que las liberaciones menores y de parches pueden liberarse tan a menudo como cada semana. Las liberaciones menores y parciales nunca deben contener cambios de ruptura.

Cuando se hace referencia al marco de trabajo de Laravel o sus componentes desde su aplicación o paquete, siempre se debe utilizar una restricción de versión como ^8.0, ya que los principales lanzamientos de Laravel incluyen cambios de ruptura. Sin embargo, nos esforzamos por asegurarnos de que siempre puedas actualizarte con un nuevo lanzamiento importante en un día o menos.

# Política de apoyo

Para los lanzamientos de LTS, como Laravel 6, se proporcionan correcciones de errores por 2 años y correcciones de seguridad por 3 años. Estas versiones proporcionan la ventana más larga de apoyo y mantenimiento. Para las versiones generales, las correcciones de errores se proporcionan durante 7 meses y las correcciones de seguridad se proporcionan durante 1 año. Para todas las bibliotecas adicionales, incluyendo Lumen, sólo la última versión recibe correcciones de errores. Además, por favor revise las versiones de la base de datos soportado por Laravel.

Version Liberación Bug Fixes Until Security Fixes Until
6 (LTS) 3 de septiembre de 2019 5 de octubre de 2021 3 de septiembre de 2022
7 3 de marzo de 2020 6 de octubre de 2020 3 de marzo de 2021
8 8 de septiembre de 2020 6 de abril de 2021 8 de septiembre de 2021

# Laravel 8

Laravel 8 continúa las mejoras realizadas en Laravel 7.x introduciendo Laravel Jetstream, clases de fábrica modelo, aplastamiento de migraciones, agrupación de trabajos, limitación de tasas mejorada, mejoras en las colas, componentes dinámicos de la hoja, vistas de paginación del viento de cola, ayudantes de pruebas de tiempo, mejoras en artisan serve, mejoras en la escucha de eventos, y una variedad de otras correcciones de errores y mejoras en la usabilidad.

Laravel Jetstream

Laravel Jetstream fue escrito por Taylor Otwell.

Laravel Jetstream es un andamiaje de aplicación bellamente diseñado para Laravel. Jetstream proporciona el punto de partida perfecto para su próximo proyecto e incluye inicio de sesión, registro, verificación de correo electrónico, autenticación de dos factores, gestión de sesiones, soporte de API a través de Laravel Sanctum y gestión de equipo opcional. Laravel Jetstream reemplaza y mejora el andamiaje de autenticación de interfaz de usuario existente en versiones anteriores de Laravel.

Jetstream está diseñado usando Tailwind CSS y ofrece su elección de Livewire o Inertia scaffolding.

Directorio de modelos

Por la abrumadora demanda de la comunidad, el esqueleto de la aplicación por defecto de Laravel ahora contiene un app/Models directorio. ¡Esperamos que disfruten de este nuevo hogar para sus modelos Elocuentes! Todos los comandos relevantes del generador han sido actualizados para asumir que los modelos existen dentro del directorio app/Models si es que existe. Si el directorio no existe, el framework asumirá que sus modelos deben ser colocados dentro del app directorio.

Model Factory Classes

Model factory classes fueron aportados por Taylor Otwell.

Eloquent model factories han sido completamente reescritas como fábricas de clase y mejoradas para tener un apoyo de primera clase en las relaciones. Por ejemplo, el UserFactory incluido con Laravel se escribe así:

<?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),
        ];
    }
}

Gracias a la nueva HasFactory rasgo disponible en los modelos generados, la fábrica de modelos puede ser usada como tal:

use App\Models\User;

User::factory()->count(50)->create();

Como las fábricas de modelos son ahora simples clases PHP, las transformaciones de estado pueden ser escritas como métodos de clase. Además, puedes añadir cualquier otra clase de ayuda a tu fábrica de modelos Eloquent según sea necesario.

Por ejemplo, usted User el modelo podría tener un suspended sque modifica uno de sus valores de atributo por defecto. Puede definir sus transformaciones de estado utilizando la fábrica base state método. Puede llamar a su método estatal como quiera. Después de todo, es un método típico de PHP:

/**
 * Indicate that the user is suspended.
 *
 * @return \Illuminate\Database\Eloquent\Factories\Factory
 */
public function suspended()
{
    return $this->state([
        'account_status' => 'suspended',
    ]);
}

Después de definir el método de transformación de estados, podemos usarlo así:

use App\Models\User;

User::factory()->count(5)->suspended()->create();

Como se ha mencionado, las fábricas modelo de Laravel 8 contienen un apoyo de primera clase para las relaciones. Así que, asumiendo que nuestro User El modelo tiene un posts método de relación, podemos simplemente ejecutar el siguiente código para generar un usuario con tres mensajes:

$users = User::factory()
            ->hasPosts(3, [
                'published' => false,
            ])
            ->create();

Para facilitar el proceso de actualización, el laravel/legacy-factories se ha lanzado para proporcionar apoyo a la anterior iteración de fábricas modelo dentro de Laravel 8.x.

Las fábricas reescritas de Laravel contienen muchas más características que creemos que te encantarán. Para aprender más sobre las fábricas de modelos, por favor consulte el database testing documentation.

Migration Squashing

Migration squashing fue aportado por Taylor Otwell.

A medida que construye su aplicación, puede acumular más y más migraciones con el tiempo. Esto puede llevar a que su directorio de migración se llene de cientos de migraciones potenciales. Si está usando MySQL o PostgreSQL, ahora puede "aplastar" sus migraciones en un solo archivo SQL. Para empezar, ejecute el comando schema:dump comando:

php artisan schema:dump

// Deshazte del esquema de la base de datos actual y reduce todas las migraciones existentes...
php artisan schema:dump --prune

Cuando ejecute este comando, Laravel escribirá un archivo de "esquema" en su directorio de base de datos/esquema. Ahora, cuando intentes migrar tu base de datos y no se hayan ejecutado otras migraciones, Laravel ejecutará primero el SQL del archivo de esquema. Después de ejecutar los comandos del archivo de esquema, Laravel ejecutará cualquier migración restante que no haya sido parte del volcado del esquema.

Job Batching

Job batching fue aportado por Taylor Otwell & Mohamed Said.

La función de agrupación de trabajos de Laravel le permite ejecutar fácilmente un lote de trabajos y luego realizar alguna acción cuando el lote de trabajos haya terminado de ejecutarse.

El nuevo batch método de la Bus facade puede utilizarse para despachar un lote de trabajos. Por supuesto, la agrupación es útil sobre todo cuando se combina con las llamadas de finalización. Por lo tanto, se puede utilizar el then, catch, y finally métodos para definir las llamadas de finalización del lote. Cada una de estas devoluciones de llamada recibirá una Illuminate\Bus\Batch cuando son invocados:

use App\Jobs\ProcessPodcast;
use App\Podcast;
use Illuminate\Bus\Batch;
use Illuminate\Support\Facades\Bus;
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;

Para saber más acerca de la agrupación de trabajos, por favor consulte el queue documentation.

Mejora de la limitación de la tasa

Las mejoras en la limitación de la tasa fueron aportadas por Taylor Otwell.

La función de limitación de la tasa de petición de Laravel ha sido aumentada con más flexibilidad y potencia, a la vez que se mantiene la compatibilidad con la API del middleware del acelerador de la versión anterior.

Los limitadores de tasa se definen usando la fachada de RateLimiter para el método. El método for acepta un nombre de limitador de tarifa y un cierre que devuelve la configuración de límite que debería aplicarse a las rutas a las que se asigna este limitador de tarifa:

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

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

Dado que las devoluciones de llamadas del limitador de tasas reciben la instancia de solicitud HTTP entrante, puede construir el límite de tasa apropiado dinámicamente basado en la solicitud entrante o el usuario autenticado:

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

A veces puede desear segmentar los límites de la tasa por algún valor arbitrario. Por ejemplo, tal vez desee permitir que los usuarios accedan a una ruta determinada 100 veces por minuto por dirección IP. Para lograr esto, puede utilizar el método by cuando construya su límite de velocidad:

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

Los limitadores de las tarifas pueden aplicarse a las rutas o grupos de rutas utilizando el throttle middleware. El middleware del acelerador acepta el nombre del limitador de velocidad que desea asignar a la ruta:

Route::middleware(['throttle:uploads'])->group(function () {
    Route::post('/audio', function () {
        //
    });

    Route::post('/video', function () {
        //
    });
});

Para saber más acerca de la limitación de la tasa, por favor consulte el routing documentation.

Modo de mantenimiento mejorado

Las mejoras en el modo de mantenimiento fueron aportadas por Taylor Otwell con la inspiración de Spatie.

En anteriores ediciones de Laravel, la función php artisan down puede ser obviada usando una "lista de permisos" de direcciones IP que fueron permitidas para acceder a la aplicación. Esta característica ha sido eliminada en favor de una solución más simple de "secret" / token.

Mientras está en el modo de mantenimiento, puede usar la opción secret para especificar una ficha de derivación del modo de mantenimiento:

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

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

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

Cuando acceda a esta ruta oculta, será redirigido a la ruta de la aplicación. Una vez que la cookie ha sido emitida a su navegador, podrá navegar la aplicación normalmente como si no estuviera en modo de mantenimiento.

Pre-Representación de la vista del modo de mantenimiento

Si utiliza el comando php artisan down durante el despliegue, sus usuarios pueden todavía encontrar ocasionalmente errores si acceden a la aplicación mientras sus dependencias de Composer u otros componentes de la infraestructura se están actualizando. Esto ocurre porque una parte significativa del framework de Laravel debe arrancar para determinar que su aplicación está en modo de mantenimiento y hacer que la vista de modo de mantenimiento utilice el motor de plantillas.

Por esta razón, Laravel ahora le permite pre-procesar una vista de modo de mantenimiento que será devuelta al principio del ciclo de solicitud. Esta vista se renderiza antes de que se haya cargado cualquiera de las dependencias de su aplicación. Puedes pre-renderizar una plantilla de tu elección usando la opción down cdel comando render:

php artisan down --render="errors::503"

Closure Dispatch / Chain catch

Catch las mejoras fueron aportadas por Mohamed Said.

Usando el nuevo catch ahora puede proporcionar un Cierre que debería ser ejecutado si un Cierre en cola no se completa con éxito después de agotar todos los intentos de reintento configurados en la cola:

use Throwable;

dispatch(function () use ($podcast) {
    $podcast->publish();
})->catch(function (Throwable $e) {
    // This job has failed...
});

Componentes dinámicos de Blade

Componentes dinámicos de Blade fueron aportados porTaylor Otwell.

A veces puede ser necesario renderizar un componente pero no saber qué componente debe ser renderizado hasta el tiempo de ejecución. En esta situación, puede utilizar el componente dinámico incorporado de Laravel para renderizar el componente en base a un valor o variable en tiempo de ejecución:

<x-dynamic-component :component="$componentName" class="mt-4" />

Para saber más sobre los componentes del Blade, por favor consulte la Documentación de Blade.

Mejoras para los oyentes de eventos

Las mejoras para los oyentes de los eventos fueron aportadas por Taylor Otwell.

Los oyentes de eventos basados en el cierre pueden ser registrados con sólo pasar el método Closure to the Event::listen. Laravel inspeccionará el Cierre para determinar qué tipo de evento maneja el oyente:

use App\Events\PodcastProcessed;
use Illuminate\Support\Facades\Event;

Event::listen(function (PodcastProcessed $event) {
    //
});

Además, los oyentes de eventos basados en el cierre pueden ahora ser marcados como en cola usando la función Illuminate\Events\queueable:

use App\Events\PodcastProcessed;
use function Illuminate\Events\queueable;
use Illuminate\Support\Facades\Event;

Event::listen(queueable(function (PodcastProcessed $event) {
    //
}));

Al igual que los trabajos en cola, puede utilizar los métodos onConnection, onQueue, y delay para personalizar la ejecución del oyente en cola:

Event::listen(queueable(function (PodcastProcessed $event) {
    //
})->onConnection('redis')->onQueue('podcasts')->delay(now()->addSeconds(10)));

Si desea manejar las fallas de los oyentes de la cola anónima, puede proporcionar un cierre al método catch mientras define el queueable oyente:

use App\Events\PodcastProcessed;
use function Illuminate\Events\queueable;
use Illuminate\Support\Facades\Event;
use Throwable;

Event::listen(queueable(function (PodcastProcessed $event) {
    //
})->catch(function (PodcastProcessed $event, Throwable $e) {
    // The queued listener failed...
}));

Ayudantes de la prueba del tiempo

Los ayudantes de la prueba del tiempo fueron aportados por Taylor Otwell con la inspiración de Ruby on Rails.

Al hacer las pruebas, puede que ocasionalmente necesites modificar el tiempo devuelto por los ayudantes como ahora o Illuminate\Support\Carbon::now(). La clase de prueba de características básicas de Laravel ahora incluye ayudantes que te permiten manipular la hora actual:

public function testTimeCanBeManipulated()
{
    // Travel into the future...
    $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();

    // Travel into the past...
    $this->travel(-5)->hours();

    // Travel to an explicit time...
    $this->travelTo(now()->subHours(6));

    // Return back to the present time...
    $this->travelBack();
}

Artisan serve Mejoras

Artisan serve las mejoras fueron aportadas por Taylor Otwell.

El comando artisan serve se ha mejorado con la recarga automática cuando se detectan cambios en las variables de entorno dentro de su archivo local .env. Anteriormente, el comando tenía que ser detenido y reiniciado manualmente.

Vistas de la paginación de Tailwind

El paginador de Laravel ha sido actualizado para usar el marco Tailwind CSS por defecto. Tailwind CSS es un marco de trabajo CSS altamente personalizable y de bajo nivel que te ofrece todos los bloques de construcción que necesitas para crear diseños a medida sin los molestos estilos de opinión que tienes que luchar para anular. Por supuesto, las vistas de Bootstrap 3 y 4 también siguen disponibles.

Actualizaciones del namespace de enrutamiento

En versiones anteriores de Laravel, el RouteServiceProvider contenía una propiedad $namespace. El valor de esta propiedad se prefijaría automáticamente en las definiciones de rutas de los controladores y en las llamadas al método action helper / URL::action. En Laravel 8.x, esta propiedad es null por defecto. Esto significa que Laravel no realizará ninguna prefijación automática del espacio de nombres. Por lo tanto, en las nuevas aplicaciones de Laravel 8.x, las definiciones de rutas de controlador deben ser definidas usando la sintaxis estándar llamable de PHP:

use App\Http\Controllers\UserController;

Route::get('/users', [UserController::class, 'index']);

Las llamadas a los métodos relacionados con la acción deben utilizar la misma sintaxis llamable:

action([UserController::class, 'index']);

return Redirect::action([UserController::class, 'index']);

If you prefer Laravel 7.x style controller route prefixing, you may simply add the $namespace propiedad en su solicitud RouteServiceProvider.