Todos los artículos

Avisos de forma reversible y una nueva fachada de excepciones en Laravel 11.4

Julian Beaujardin
Julian Beaujardin April 17th, 2024

Esta semana, el equipo de Laravel lanzó la versión 11.4, con mensajes de formulario reversibles, una nueva fachada de excepciones, compatibilidad con Enum en el método Collection::mapInto() y más.

Nueva fachada de excepciones

Nuno Maduro contribuyó a una nueva fachada de Excepciones:

La fachada de Excepciones proporciona una forma consistente de probar excepciones en aplicaciones Laravel. Aquí está la lista de métodos que proporciona la fachada de Excepciones:

  • assertReported
  • assertReportedCount
  • assertNotReported
  • assertNothingReported
  • throwOnReport
  • throwFirstReported

Aquí hay un ejemplo de la descripción de la solicitud de extracción que ilustra el método Exceptions::fake() y el método assertReported():

use Illuminate\Support\Facades\Exceptions;

test('example', function () {
    Exceptions::fake();

    $this->post('/generate-report', [
        'throw' => 'true',
    ])->assertStatus(503); // Service Unavailable

    Exceptions::assertReported(ServiceUnavailableException::class);

    // or
    Exceptions::assertReported(function (ServiceUnavailableException $exception) {
        return $exception->getMessage() === 'Service is currently unavailable';
    });
});

Consulte la sección Manejo de excepciones de la documentación de Pruebas HTTP para obtener detalles de uso.

Directivas de estilo Livewire

@devajmeireles contribuyó con la capacidad de utilizar directivas de estilo booleano, sin ningún valor definido:

{{-- Before  --}}

<x-fetch wire:poll />

{{-- Generates this HTML --}}

<div ... wire:poll="wire:poll" />

{{-- After  --}}
<x-fetch wire:poll />

<div ... wire:poll />

Formularios reversibles en indicaciones

Luke Downing contribuyó con mensajes de formulario, que son un conjunto agrupado de mensajes que el usuario debe completar. Los formularios incluyen la capacidad de regresar a indicaciones anteriores y realizar cambios sin tener que cancelar el comando y comenzar de nuevo:

use function Laravel\Prompts\form;

$responses = form()
    ->text('What is your name?', required: true)
    ->password('What is your password?', validate: ['password' => 'min:8'])
    ->confirm('Do you accept the terms?')
    ->submit();

Here's an example of using values from previous responses:

$responses = form()
    ->text('What is your name?', name: 'name')
    ->add(fn () => select('What is your favourite language?', ['PHP', 'JS']), name: 'language')
    ->add(fn ($responses) => note("Your name is {$responses['name']} and your language is {$responses['language']}"))
    ->submit();

See Pull Request #118 in the laravel/prompts project for implementation details. This feature is already documented in the Prompts documentation.

Agregar soporte para enumeraciones en el método de colección mapInto

Luke Downing contribuyó con soporte para enumeraciones en el método Collection::mapInto(), que le permite crear enumeraciones a partir de una matriz de valores:

public function store(Request $request)
{
    $request->validate([
        'features' => ['array'],
        'features.*' => [new Enum(Feature::class)],
    ]);

    $features = $request
        ->collect('features')
        ->mapInto(Feature::class);

    if ($features->contains(Feature::DarkMode)) {
        // ...
    }
}

Un gancho afterQuery()

Günther Debrauwer contribuyó con un gancho afterQuery() para ejecutar código después de ejecutar una consulta:

$query->afterQuery(function ($models) {
    // Make changes to the queried models ...
});

Aquí hay un ejemplo de caso de uso de la descripción de la solicitud de extracción:

// Before

public function scopeWithIsFavoriteOf($query, ?User $user = null) : void
{
    if ($user === null) {
        return $query;
    }

    $query->addSelect([
        // 'is_favorite' => some query ...
    ]);
}

$products = Product::withIsFavoriteOf(auth()->user())->get();

if (auth()->user() === null) {
    $products->each->setAttribute('is_favorite', false);
}

Y aquí está el código que usa el gancho afterQuery():

// After

public function scopeWithIsFavoriteOf($query, ?User $user = null) : void
{
    if ($user === null) {
        $query->afterQuery(fn ($products) => $products->each->setAttribute('is_favorite', false));

        return;
    }

    $query->addSelect([
        // 'is_favorite' => some query ...
    ]);
}

Product::withIsFavoriteOf(auth()->user())->get();

Notas de la Versión

Puede ver la lista completa de nuevas funciones y actualizaciones a continuación y la diferencia entre 11.3.0 y 11.4.0 en GitHub. Las siguientes notas de la versión provienen directamente del registro de cambios