Esquema de versiones

Laravel y sus otros paquetes de primeros (paquetes desarrollados por una propia compañía) siguen el versionamiento semántico. Los principales lanzamientos del framework son realizados cada seis meses (Febrero y Agosto), mientras que los menores y los parches pueden ser realizados tan frecuente como cada semana. Los lanzamientos de versiones menores y los parches nunca deberían contener cambios que causen que otros componentes fallen (breaking changes).

Cuando haces referencia al framework Laravel o sus componentes desde tu aplicación o paquete, debes utilizar siempre una restricción de versión como ^6.0, ya que las versiones mayores de Laravel incluyen "breaking changes". Sin embargo, nos esforzamos por asegurarnos siempre de que puedas actualizar a una nueva versión mayor en un día o menos.

Política de soporte

Para las versiones LTS, como Laravel 6, se proporcionan correcciones de errores durante 2 años y correcciones de seguridad por 3 años. Estas versiones proporcionan la ventana más larga de soporte y mantenimiento. Para las versiones generales, las correcciones de errores se proporcionan durante 6 meses y las correcciones de seguridad durante 1 año. Para todas las librerías adicionales, incluyendo Lumen, solo la última versión recibe correcciones de error. Adicionalmente, por favor revisa las versiones de bases de datos soportadas por Laravel.

Versión Lanzamiento Corrección de errores hasta Correcciones de seguridad hasta
5.5 (LTS) 30 de Agosto, 2017 30 de Agosto, 2019 30 de Agosto, 2020
5.6 7 de Febrero, 2018 7 de Agosto, 2018 7 de Febrero, 2019
5.7 4 de Septiembre, 2018 4 de Marzo, 2019 4 de Septiembre, 2019
5.8 26 de Febrero, 2019 26 de Agosto, 2019 26 de Febrero, 2020
6 (LTS) 3 de Septiembre, 2019 3 de Septiembre, 2021 3 de Septiembre, 2022

Laravel 6

Laravel 6 (LTS) continúa las mejoras hechas en Laravel 5.8 con la introducción del versionamiento semántico, la compatibilidad con Laravel Vapor, las respuestas de autorización mejoradas, el middleware job o de trabajos, las colecciones lazy o diferidas, las mejoras de subquery o subconsulta, la extracción de la estructura de frontend al paquete de Composer laravel/ui, y una variedad de correcciones de error y mejoras de usabilidad.

Versionamiento semántico

El paquete (laravel/framework) del framework Laravel ahora sigue el versionamiento semántico estándar. Esto hace consistente al framework con los otros paquetes de primeros de Laravel que ya siguen éste versionamiento estándar. El ciclo de lanzamiento de Laravel permanecerá sin cambio.

Laravel Vapor Compatibility

Laravel Vapor fue construido por Taylor Otwell.

Laravel 6 proporciona compatibilidad con Laravel Vapor, una plataforma de despliegue sin servidor para auto-escalar. Vapor abstrae la complejidad del manejo de aplicaciones de Laravel sobre Lambda AWS, al tiempo que provee una interfaz de esas aplicaciones con las colas SQS, las bases de datos, clusters de Redis, redes, CDN CloudFront, y más.

Excepciones mejoradas por medio de Ignition

Laravel 6 viene con Ignition, una nueva página hecha en código abierto para mostrar el detalle de las excepciones de error por Freek Van der Herten y Marcel Pociot. Ignition ofrece muchos beneficios sobre las versiones anteriores, tales como el manejo mejorado del archivo de error de Blade y el número de línea, soluciones "runnables" (aquellas que implementan una interfaz con el método run() para su ejecución independiente) para problemas comunes, edición de código, compartimiento de excepciones, y una UX mejorada.

Respuestas de autorización mejoradas

Las respuestas de autorización mejoradas fueron implementadas por Gary Green.

En las versiones previas de Laravel, era difícil buscar y mostrar los mensajes de autorización personalizados a los usuarios finales. Esto hizo que fuera difícil explicar exactamente a los usuarios finales el porqué una solicitud era denegada. En Laravel 6, esto es ahora mucho más fácil usando los mensajes de respuesta de autorización y el nuevo método Gate::inspect. Por ejemplo, dado el siguiente método de política:

/**
 * Determine if the user can view the given flight.
 *
 * @param  \App\User  $user
 * @param  \App\Flight  $flight
 * @return mixed
 */
public function view(User $user, Flight $flight)
{
    return $this->deny('Explanation of denial.');
}

La respuesta y el mensaje de la política de autorización pueden ser consultados usando el método Gate::inspect:

$response = Gate::inspect('view', $flight);

if ($response->allowed()) {
    // User is authorized to view the flight...
}

if ($response->denied()) {
    echo $response->message();
}

Adicionalmente, estos mensajes personalizados serán automáticamente devueltos a tu frontend al momento de usar los métodos helper tales como $this->authorize o Gate::authorize de tus rutas o controladores.

Los Middleware job

Los middleware job fueron implementados por Taylor Otwell.

Los middleware job permiten que envuelvas la lógica personalizada que rodea la ejecución de los trabajos en colas, al reducir las plantillas de código en los trabajos mismos. Por ejemplo, en las versiones previas de Laravel, puedes haber encerrado la lógica del método handle de un trabajo dentro de una función de retorno o callback para límite de tráfico:

/**
 * Execute the job.
 *
 * @return void
 */
public function handle()
{
    Redis::throttle('key')->block(0)->allow(1)->every(5)->then(function () {
        info('Lock obtained...');

        // Handle job...
    }, function () {
        // Could not obtain lock...

        return $this->release(5);
    });
}

En Laravel 6, ésta lógica puede ser extraída hacia un middleware de trabajo, permitiéndote que mantengas el método handle de tu trabajo libre de cualquiera de las responsabilidades de límite de tráfico:

<?php

namespace App\Jobs\Middleware;

use Illuminate\Support\Facades\Redis;

class RateLimited
{
    /**
     * Process the queued job.
     *
     * @param  mixed  $job
     * @param  callable  $next
     * @return mixed
     */
    public function handle($job, $next)
    {
        Redis::throttle('key')
                ->block(0)->allow(1)->every(5)
                ->then(function () use ($job, $next) {
                    // Lock obtained...

                    $next($job);
                }, function () use ($job) {
                    // Could not obtain lock...

                    $job->release(5);
                });
    }
}

Después de crear los middleware, pueden ser adjuntados a un trabajo al retornarlos desde el método middleware del trabajo:

use App\Jobs\Middleware\RateLimited;

/**
 * Get the middleware the job should pass through.
 *
 * @return array
 */
public function middleware()
{
    return [new RateLimited];
}

Colecciones diferidas

Las colecciones diferidas o lazy fueron implementadas por Joseph Silber.

Muchos desarrolladores ya disfrutan de los poderosos métodos de las Colecciones. Para complementar la ya poderosa clase Collection, Laravel 6 introduce una LazyCollection, que hace uso de los generadores de PHP para permitir que trabajes con conjunto de datos muy grandes mientras mantiene el uso de memoria bajo.

Por ejemplo, imagina que tu aplicación necesita procesar un archivo log de muchos gigabytes mientras toma ventaja de los métodos de la colección de Laravel para analizar los logs. En lugar de leer el archivo completo desde memoria de una sola vez, las colecciones diferidas pueden ser usadas para mantener solamente una pequeña parte del archivo en memoria en un momento determinado:

use App\LogEntry;
use Illuminate\Support\LazyCollection;

LazyCollection::make(function () {
    $handle = fopen('log.txt', 'r');

    while (($line = fgets($handle)) !== false) {
        yield $line;
    }
})
->chunk(4)
->map(function ($lines) {
    return LogEntry::fromLines($lines);
})
->each(function (LogEntry $logEntry) {
    // Process the log entry...
});

O, imagina que necesitas recorrer 10.000 modelos de Eloquent. Al momento de usar las colecciones de Laravel tradicionales, la totalidad de modelos de Eloquent debe ser cargada en memoria al mismo tiempo:

$users = App\User::all()->filter(function ($user) {
    return $user->id > 500;
});

Sin embargo, a partir de Laravel 6, el método cursor del constructor de consultas ha sido actualizado para devolver una instancia de LazyCollection. Esto permite que ejecutes todavía solamente una única consulta contra la base de datos sino que también sólo mantiene un modelo de Eloquent cargado en memoria al mismo tiempo. En este ejemplo, la función de retorno (callback) filter no es ejecutada hasta que realmente iteremos sobre cada usuario individualmente, permitiendo una reducción drástica del uso de memoria:

$users = App\User::cursor()->filter(function ($user) {
    return $user->id > 500;
});

foreach ($users as $user) {
    echo $user->id;
}

Realces de subconsulta de Eloquent

Los realces de subconsulta de Eloquent fueron implementados por Jonathan Reinink.

Laravel 6 introduce varios realces y mejoras nuevos para dar soporte a la subconsulta de base de datos. Por ejemplo, vamos a imaginar que tenemos una tabla de destinos de vuelos destinations y una tabla de vuelos flights a los destinos. La tabla flights contiene una columna arrived_at que indica cuando el vuelo llega al destino.

Usando la nueva funcionalidad select para subconsulta de Laravel 6, podemos seleccionar todos los campos en destinations y el nombre del vuelo que llegó más recientemente a cada destino haciendo una sola consulta:

return Destination::addSelect(['last_flight' => Flight::select('name')
    ->whereColumn('destination_id', 'destinations.id')
    ->orderBy('arrived_at', 'desc')
    ->limit(1)
])->get();

Adicionalmente, podemos usar las nuevas características de subconsulta agregadas a la función orderBy del constructor de consulta para ordenar todos los destinos dependiendo del último vuelo que llegue a cada destino. Una vez más, esto puede ser hecho haciendo una única consulta contra la base de datos:

return Destination::orderByDesc(
    Flight::select('arrived_at')
        ->whereColumn('destination_id', 'destinations.id')
        ->orderBy('arrived_at', 'desc')
        ->limit(1)
)->get();

UI de Laravel

La estructura del frontend proporcionada típicamente con las versiones previas de Laravel han sido extraídas al paquete de Composer laravel/ui. Esto permite que la estructura UI del socio o "first-party" sea desarrollada y versionada separadamente del framework primario. Como resultado de este cambio, ningún código de Bootstrap o Vue está presente en la estructura del framework de forma predeterminada, y el comando make:auth ha sido extraído del framework también.

Con el propósito de restaurar la estructura de Vue / Bootstrap presente en las versiones previas de Laravel, puedes instalar el paquete laravel/ui y usar el comando Artisan ui para instalar la estructura de frontend:

composer require laravel/ui "^1.0" --dev

php artisan ui vue --auth

Regístrate hoy en Styde y obtén acceso a todo nuestro contenido.

Lección anterior Laravel Telescope - Documentación de Laravel 6 Lección siguiente Guía de Actualización - Documentación de Laravel 6