News

Reversible Form Prompts and a New Exceptions Facade in Laravel 11.4

Published Updated
Reversible Form Prompts and a New Exceptions Facade in Laravel 11.4 image

Release updates

Never miss a Laravel release

Get an email whenever a new Laravel release lands.

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.

Introduce the Exceptions Facade

Nuno Maduro contributed the Exceptions facade:

The Exceptions facade provides a consistent way to test exceptions in Laravel applications. Here is the list of methods that the Exceptions facade provides:

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

Here's an example from the pull request description illustrating the Exceptions::fake() method and assertReported() method:

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';
});
});

Read our Asserting Exceptions in Laravel Tests article for more details.

Livewire-style Directives

@devajmeireles contributed the ability to use Boolean-style directives, without any defined value:

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

Luke Downing contributed form prompts, which are a grouped set of prompts for the user to complete. Forms include the ability to return to previous prompts and make changes without having to cancel the command and start over:

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.

Add Support for Enums on mapInto Collection Method

Luke Downing contributed support for Enums on the Collection::mapInto() method, which allows you to build up enums from an array of values:

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)) {
// ...
}
}

An afterQuery() Hook

Günther Debrauwer contributed an afterQuery() hook to run code after running a query:

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

Here's a use-case example from the pull request's description:

// 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);
}

And here's the code using the afterQuery() hook:

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

Release notes

You can see the complete list of new features and updates below and the diff between 11.3.0 and 11.4.0 on GitHub. The following release notes are directly from the changelog:

v11.4.0

Paul Redmond photo

Staff writer at Laravel News. Full stack web developer and author.

Sponsored

laravelcloud logo
Laravel Cloud

Easily create and manage your servers and deploy your Laravel applications in seconds.

Visit Laravel Cloud

The latest

View all →
CPX: The Composer Package Executor for PHP image

CPX: The Composer Package Executor for PHP

Read article
Laravel AI SDK Adds Human-in-the-Loop Tool Approval image

Laravel AI SDK Adds Human-in-the-Loop Tool Approval

Read article
Pest 5 Released With Test Impact Analysis, Agent Verification, and Evals image

Pest 5 Released With Test Impact Analysis, Agent Verification, and Evals

Read article
Queue-SQL: Run Mass Deletes and Updates Across Parallel Queue Jobs image

Queue-SQL: Run Mass Deletes and Updates Across Parallel Queue Jobs

Read article
Blade Formatting in Laravel Pint image

Blade Formatting in Laravel Pint

Read article
Inertia DevTools Is Now on the Chrome Web Store image

Inertia DevTools Is Now on the Chrome Web Store

Read article