Back to Blog

Laravel 10.38 Released

Julian Beaujardin
Julian Beaujardin December 20th, 2023

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