Reversibles Form Prompts y un nuevo Facade de excepciones en Laravel 11.4

- Andrés Cruz

This week, the Laravel team released v11.4, with reversible form Prompts, a new Exceptions facade, Enum support in the Collection::mapInto() method, and more.

Exceptions Facade

Nuno Maduro contributed the Exceptions facade:

Los Facades de Excepciones proporciona una forma consistente de probar excepciones en aplicaciones Laravel. Aquí está la lista de métodos que proporciona los Facades 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';
   });
});
See the Exception Handling section of the HTTP Tests documentation for usage details.

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 />

Reversible Forms in Prompts

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();

Agregar soporte para enumedados en el método de mapInto Collection

Contribuyó con soporte para Enums en el método Collection::mapInto(), que le permite crear enumeraciones a partir de una serie 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)) {
       // ...
   }
}

afterQuery() Hook

Hook 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 pull request's:
 

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 utiliza el hook afterQuery():

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();

 

Artículo original:

https://laravel-news.com/laravel-11-4-0

Andrés Cruz

Desarrollo con Laravel, Django, Flask, CodeIgniter, HTML5, CSS3, MySQL, JavaScript, Vue, Android, iOS, Flutter

Andrés Cruz en Udemy

Acepto recibir anuncios de interes sobre este Blog.