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.

!Cursos desde!

10$

En Udemy

Quedan 1d 23:10!

Udemy

!Cursos desde!

4$

En Academia

Ver los cursos

!Libros desde!

1$

Ver los libros
¡Hazte afiliado en Gumroad!