Laravel 10.38 Released
This week, the Laravel team released v10.38 with a fromRoute() testing helper, a Blade @session directive, basic whereJsonContains support for SQLite, and more.
As part of Laravel's weekly releases, the team also rolled out Vite 5 support to all first-party Laravel packages. For example, when you run laravel new to create a new Laravel application or you install Breeze, you will be using Vite 5 out of the box!
Add fromRoute() testing helper
@fragkp contributed a fromRoute()
testing helper to assert a redirect response in a feature test. This method is syntactic sugar for passing a route to the from()
test case method:
// Using the `from()` method
$this->from(route('index'))
->get(route('language', ['language' => 'de']))
->assertRedirectToRoute('index');
You can now pass a string to the fromRoute()
method for convenience:
$this->fromRoute('index') // changed
->get(route('language', ['language' => 'de']))
->assertRedirectToRoute('index');
Add charset and collation method to Blueprint
@gcazin contributed two new methods to the schema Blueprint class for defining charset and collation:
// via property
Schema::table('foo', function (Blueprint $table) {
$table->charset = 'utf8mb4';
$table->collation = 'utf8mb4_unicode_ci';
// ...
});
// New methods
Schema::table('foo', function (Blueprint $table) {
$table->charset('utf8mb4');
$table->collation('utf8mb4_unicode_ci');
// ...
});
Add Blade @session directive
Jared Lewis contributed a @session
blade directive for checking if a session value exists. It supports embedded @session
usage as well:
{{-- Before --}}
@if(session('status'))
<div class="alert alert-success" role="alert">
{{ session('status') }}
</div>
@endif
{{-- After --}}
@session('status')
<div class="alert alert-success" role="alert">
{{ $value }}
</div>
@endsession
Add SQLite support for whereJsonContains
Daniele Ambrosino contributed support for whereJsonContains
using the SQLite database:
SQLite added JSON support by default as of version 3.38.0. Nonetheless, the SQLiteGrammar does not currently support whereJsonContains and whereJsonDoesntContain methods regardless of the SQLite version.
Here's an example from the pull request description:
$users = DB::table('users')
->whereJsonContains('options->languages', 'en')
->get();
/*
select * from "users"
where exists (select 1 from json_each("options", '$."languages"') where "json_each"."value" is ?)
*/
//
$users = DB::table('users')
->whereJsonContains('options->languages', false);
// the `where` part would look like: `where "json_each"."value" is false`
Add Conditionable to Pipeline
@shane-zeng contributed adding the Conditionable
trait to pipelines, which gives you the ability to write pipelines without weird conditions between them.
Here's how we might have to write a pipeline with conditions before Laravel 10.38:
$pipeline = Pipeline::send($user)
->through([
GenerateProfilePhoto::class,
]);
if (! $user->isAdmin) {
$pipeline->pipe([
SendWelcomeEmail::class,
ActivateSubscription::class,
]);
}
$user = $pipeline->then(fn (User $user) => $user);
Now, you can use the Conditionable
's when
and unless
methods to chain pipeline logic seamlessly:
$user = Pipeline::send($user)
->through([
GenerateProfilePhoto::class,
])
->when(! $user->isAdmin, function (Pipeline $pipeline) {
$pipeline->pipe([
SendWelcomeEmail::class,
ActivateSubscription::class,
]);
})
->then(fn (User $user) => $user);
Improve Arr::dot() performance
@bastien-phi contributed an update that improves Arr::dot()
performance; in some cases, it seems like it improves things quite drastically as the number of array items increases. See Pull Request #49386 for further details.
Release notes
You can see the complete list of new features and updates below and the diff between 10.37.0 and 10.38.0 on GitHub. The following release notes are directly from the changelog