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
Desarrollo con Laravel, Django, Flask, CodeIgniter, HTML5, CSS3, MySQL, JavaScript, Vue, Android, iOS, Flutter