Todos los artículos

Constructores Dinámicos de Caché, Base de Datos y Correo en Laravel 11.31

Julian Beaujardin
Julian Beaujardin November 12th, 2024

El equipo de Laravel lanzó la versión 11.31, que incluye constructores dinámicos de caché, base de datos y correo, un repositorio de tokens de caché, un método de conveniencia URL::forceHttps(), y más.

Repositorio de Tokens de Caché

Andrew Brown contribuyó un repositorio de tokens de caché como una forma alternativa de almacenar tokens de restablecimiento de contraseña:

Esta solicitud de incorporación de cambios (PR) propone un nuevo CacheTokenRepository que permitirá manejar los tokens de restablecimiento de contraseña a través de la caché. En mi opinión, la caché es un medio de almacenamiento perfecto porque puede ser más efímera, al igual que los tokens de restablecimiento de contraseña.

Para habilitar este nuevo CacheTokenRepository, ajusta tu archivo config/auth.php de la siguiente manera:

'passwords' => [

    // nuevo driver de caché
    'customers' => [
        'driver'   => 'cache',
        'store'    => 'passwords',
        'provider' => 'customers',
        'expire'   => 60,
        'throttle' => 60,
    ],

   // driver de base de datos antiguo por defecto
    'users'     => [
        'provider' => 'users',
        'table'    => 'password_reset_tokens',
        'expire'   => 60,
        'throttle' => 60,
    ],
],

Consulta Pull Request #53428 para obtener detalles sobre la implementación.

Construcción Dinámica de Correos Bajo Demanda

Steve Bauman contribuyó con la capacidad de construir dinámicamente un correo y enviarlo usando el método Mail::build(). Esto permite a los desarrolladores crear correos basados en una configuración dada en lugar de estar codificados en los archivos de configuración:

use Illuminate\Support\Facades\Mail;

$mailer = Mail::build([
    'transport' => 'smtp',
    'host' => '127.0.0.1',
    'port' => 587,
    'encryption' => 'tls',
    'username' => 'usr',
    'password' => 'pwd',
    'timeout' => 5,
]);

$mailer->send($mailable);

Consulta Pull Request #53411 para discusión y detalles de implementación.

Agregar el Método DB::build()

Similar al método Mail::build(), Steve Bauman contribuyó con DB::build() para crear dinámicamente nuevas conexiones de base de datos que no están definidas en tu archivo de configuración:

use Illuminate\Support\Facades\DB;

$sqlite = DB::build([
    'driver' => 'sqlite',
    'database' => ':memory:',
]);

$mysql = DB::build([
    'driver' => 'mysql',
    'database' => 'database',
    'username' => 'root',
    'password' => 'secret',
]);

$pgsql = DB::build([
    'driver' => 'pgsql',
    // ...
]);

$sqlsrv = DB::build([
    'driver' => 'sqlsrv',
    // ...
]);

Consulta Pull Request #53464 para obtener más detalles.

Agregar Cache::build() para Crear Repositorios de Caché Bajo Demanda

Steve Bauman contribuyó con la capacidad de construir dinámicamente repositorios de caché bajo demanda usando el método Cache::build(). Similar al método de construcción dinámica para base de datos y correos, puedes crear repositorios de caché no definidos en tu archivo de configuración:

use Illuminate\Support\Facades\Cache;

$apc = Cache::build([
    'driver' => 'apc',
]);

$array = Cache::build([
    'driver' => 'array',
    'serialize' => false,
]);

$database = Cache::build([
    'driver' => 'database',
    'table' => 'cache',
    'connection' => null,
    'lock_connection' => null,
]);

$file = Cache::build([
    'driver' => 'file',
    'path' => storage_path('framework/cache/data'),
]);

Consulta Pull Request #53454 para detalles de implementación.

El Método Batch and Chain onQueue() Acepta Enumeraciones de Respaldo

Philip Iezzi contribuyó con la capacidad de usar una enumeración de respaldo con el método onQueue() de una cadena de Bus:

// Antes
Bus::chain($jobs)
    ->onQueue(QueueName::long->value)->dispatch();

// Después
Bus::chain($jobs)
    ->onQueue(QueueName::long)->dispatch();

Consulta Pull Request #53359 para detalles de implementación.

Agregar el Método removeDeferredServices() en Application

Ollie Read contribuyó con el método removeDeferredServices() para eliminar un servicio diferido del contenedor de la aplicación.

// Antes
$deferredServices = $app->getDeferredServices();

unset($deferredServices['auth.password'], $deferredServices['auth.password.broker']);

$app->setDeferredServices($deferredServices);

// Después
$app->removeDeferredServices(['auth.password', 'auth.password.broker']);

Este caso de uso no es común, pero este método complementa bien los métodos de obtención y configuración de servicios diferidos. Consulta Pull Request #53362 para obtener más detalles.

Capacidad para Agregar Prioridad a Middleware desde Application Builder

Ollie Read también contribuyó con un cambio de bajo nivel para agregar prioridad a middleware en el constructor de aplicaciones, permitiendo el acceso para añadir métodos de middleware después/antes en el kernel:

return Application::configure(basePath: dirname(__DIR__))
    ->withRouting(
        web: __DIR__.'/../routes/web.php',
        commands: __DIR__.'/../routes/console.php',
        health: '/up',
    )
    ->withMiddleware(function (Middleware $middleware) {
        $middleware->appendToPriorityList(
            [
                \Illuminate\Cookie\Middleware\EncryptCookies::class,
                \Illuminate\Contracts\Auth\Middleware\AuthenticatesRequests::class,
            ],
            \Illuminate\Routing\Middleware\ValidateSignature::class
        );

        $middleware->prependToPriorityList(
            [
                \Illuminate\Cookie\Middleware\EncryptCookies::class,
                \Illuminate\Contracts\Auth\Middleware\AuthenticatesRequests::class,
            ],
            \Illuminate\Routing\Middleware\ValidateSignature::class
        );
    })
    ->withExceptions(function (Exceptions $exceptions) {
        //
    })->create();

Consulta Pull Request #53326 para obtener más detalles.

Agregar el Método forceHttps() para Forzar el Uso de HTTPs en URLs

Dasun Tharanga contribuyó con el método forceHttps(), que simplifica el forzar el uso de HTTPs en URLs que lo requieren. El método acepta un valor booleano, lo que facilita el forzar HTTPs para un conjunto de entornos:

URL::forceHttps(
    $this->app->isProduction()
);

URL::forceHttps(
    $this->app->environment('staging', 'production')
);

Consulta Pull Request #53381 para detalles de implementación.

Notas de la Versión

Puedes ver la lista completa de nuevas características y actualizaciones a continuación y la diferencia entre 11.30.0 y 11.31.0 en GitHub. Las siguientes notas de la versión son directamente del cambio de registro.