Todos los artículos

Reescritura: Análisis y Mutación de URI en Laravel 11.35

Julian Beaujardin
Julian Beaujardin December 10th, 2024

Esta semana, el equipo de Laravel lanzó la versión 11.35, que incluye análisis y mutación de URI, la capacidad de deshabilitar la truncación de respuestas de excepciones del cliente HTTP, transformar una respuesta HTTP en una instancia Fluent y mucho más.

Análisis y Mutación de URI

Taylor Otwell contribuyó con una clase Uri para el análisis y la mutación de URI.

$uri = Uri::of('https://laravel.com')
    ->withQuery(['name' => 'Taylor'])
    ->withPath('/docs/installation')
    ->withFragment('hello-world');

$uri->scheme();
$uri->host();
$uri->user();
$uri->password();
$uri->path();
$uri->port();
$uri->query()->all();
$uri->query()->has('name');
$uri->query()->missing('name');
$uri->query()->decode();

// Y más...

return (string) $uri;

También puedes obtener una instancia de URI desde la solicitud actual, rutas nombradas y URLs:

$uri = $request->uri();

$uri = Uri::to('/algo')->withQuery(...);

$uri = Uri::route('ruta-nombrada', ['user' => $user]);

Personalizar o Deshabilitar la Truncación de Mensajes de Excepciones del Cliente HTTP

Steve Bauman contribuyó con la capacidad de personalizar o deshabilitar la truncación de respuestas de excepciones HTTP a través de la configuración de inicio de la aplicación. En el callback withExceptions(), puedes personalizar la longitud de truncación o deshabilitarla completamente de la siguiente manera:

// bootstrap/app.php

use Illuminate\Http\Client\RequestException;

return Application::configure(basePath: dirname(__DIR__))
    // ...
    ->withExceptions(function (Exceptions $exceptions) {
        $exceptions->dontTruncateRequestExceptions();

        // O ...

        $exceptions->truncateRequestExceptionsAt(260);
    })->create();

Transformar los Datos de Respuesta del Cliente HTTP en una Instancia Fluent

Steve Bauman contribuyó con la capacidad de transformar los datos de respuesta del Cliente HTTP en una instancia Fluent:

$fluent = Http::get('https://api.example.com/products/1')->fluent();

$fluent->float('price'); // 420.69
$fluent->collect('colors'); // Collection(['rojo', 'azul'])
$fluent->boolean('on_sale'); // true
$fluent->integer('current_stock'); // 69

Añadir el Trait Conditionable a la Solicitud

Ahmet Imamoglu añadió el trait Conditionable a las solicitudes HTTP. Al igual que con el constructor de consultas, ahora puedes usar when() en una clase de solicitud:

/**
 * Preparar los datos para la validación.
 */
protected function prepareForValidation(): void
{
    $this->when($this->input('account_id'),
        fn (Request $req, int $accountId) => $req->merge(['account_name' => Account::getName($accountId)]),
        fn (Request $req) => $req->merge(['account_name' => null])

    )->when($this->input('contact_id'),
        fn (Request $req, int $contactId) => $req->merge(['contact_name' => Contact::getName($contactId)]),
        fn (Request $req) => $req->merge(['contact_name' => null])
    );
}

Permitir Ordenar las Rutas por Definición en route:list

Mathieu TUDISCO contribuyó con la capacidad de ordenar los resultados de route:list por definición:

php artisan route:list --sort=definition

Manejo de Programación: Hacer Ping al Éxito y al Fracaso

Luca Castelnuovo contribuyó con los métodos pingOnSuccessIf() y pingOnFailureIf() para el manejo de la programación. Esto permite que el programador haga ping a una URL cuando una tarea falle o tenga éxito:

$pingBackupRun = (bool) config('services.ohdear.tasks.backup:run', false);
$pingBackupRunUrl = config('services.ohdear.tasks.backup:run');

Schedule::command('backup:run')->hourly()
    ->pingBeforeIf($pingBackupRun, $pingBackupRunUrl . '/starting')
    ->pingOnSuccessIf($pingBackupRun, $pingBackupRunUrl . '/finished')
    ->pingOnFailureIf($pingBackupRun, $pingBackupRunUrl . '/failed');

Notas de la versión

Puedes ver la lista completa de nuevas características y actualizaciones a continuación, así como la diferencia entre 11.34.0 y 11.35.0 en GitHub. Las siguientes notas de la versión provienen directamente del changelog: