News

Laravel 8.47 Released

Published
Laravel 8.47 Released image

Release updates

Never miss a Laravel release

Get an email whenever a new Laravel release lands.

The Laravel team released 8.47 with string matching methods, scoped service container instances, whereContains() JSON assertions, and the latest changes in the 8.x branch:

String Match and Match All Methods

Luke Downing contributed Str::match() and Str::matchAll() methods. Previously, these methods were only available using a Stringable instance:

// works in previous releases
Str::of('xyz')->match('/(xyz)/');
 
// works as of 8.47
Str::match('/(xyz)/');

This feature moves the core logic into the Str class, and now Stringable calls the Str implementation.

Scoped Service Container Instances

Mohamed Said contributed binding scoped singletons, which are singletons that must be flushed when switching application context:

$this->app->scoped('service', function (){
return new Service(...);
});

Use-cases include a new Laravel Octane request, processing a new queued job, etc.:

The scoped method binds a class or interface into the container that should only resolve an instance one time within a given Laravel request/job lifecycle

Check out the documentation to learn more!

A “whereContains()” JSON Assertion Method

Steve Bauman contributed a whereContains() method to the AssertableJson class. The pull request explains the purpose of this assertion method as follows:

When running tests, I’ve found it difficult to test whether a JSON array contains a set of values, as well as out-of-order results that I don’t have fine-tuned control over their sorting.

This new method is helpful when testing a JSON endpoint that returns database results, as you can test that a nested set of arrays contain all of the values/IDs you’re expecting in any order.

Comparisons are performed in a strict manner to follow suit with the other methods in the AssertableJson class.

Here are some examples from the pull request:

$assert = AssertableJson::fromArray([
'foo' => [1,2,3],
'bar' => 'baz',
]);
 
// Passes:
$assert->whereHas('foo', 1);
$assert->whereHas('foo', [2,3]);
$assert->whereHas('bar', 'baz');
 
// Fails:
$assert->whereHas('foo', '1'); // Property [foo] does not contain [1].
$assert->whereHas('foo', 4); // Property [foo] does not contain [4].
$assert->whereHas('foo', [3,4]); // Property [foo] does not contain [4].
$assert->whereHas('bar', ['bar','baz']); // Property [bar] does not contain [bar].

Allow tap() on the Paginator Instance

Mior Muhammad Zaki contributed the ability to use tap() on the paginatior instance. Here’s an example of what it looks like before/after from the pull request:

// Before
$posts = App\Models\Post::search('Laravel')->paginate();
$posts->load('author');
 
// After
App\Models\Post::search('Laravel')
->paginate()
->tap(function ($posts) {
$posts->load('author');
});

Release Notes

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

v8.47.0

Added

  • Introduce scoped instances (#37521, 2971b64)
  • Added whereContains AssertableJson method (#37631, 2d2d108)
  • Added Illuminate/Database/Connection::setRecordModificationState() (ee1e6b4)
  • Added match() and matchAll() methods to Illuminate/Support/Str.php (#37642)
  • Copy password rule to current_password (#37650)
  • Allow tap() on Paginator (#37682)

Revert

Fixed

  • Remove illuminate/foundation dependency from Password validation (#37648)
  • Fixed callable password defaults in validator (0b1610f)
  • Fixed dns_get_record loose check of A records for active_url rule (#37675)
  • Type hinted arguments for Illuminate\Validation\Rules\RequiredIf (#37688)
  • Fixed when passed object as parameters to scopes method (#37692)
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 →
Agent Run Observability in Laravel AI SDK 0.11 image

Agent Run Observability in Laravel AI SDK 0.11

Read article
Debounced Queued Event Listeners in Laravel image

Debounced Queued Event Listeners in Laravel

Read article
Statamic Mailables Viewer Previews Laravel Emails in the Control Panel image

Statamic Mailables Viewer Previews Laravel Emails in the Control Panel

Read article
Laravel Tackle: Run an AI Coding Agent in Your Laravel App image

Laravel Tackle: Run an AI Coding Agent in Your Laravel App

Read article
Queue::forward(): Reroute Laravel Queues in One Place image

Queue::forward(): Reroute Laravel Queues in One Place

Read article
Laravel Read-Through Filesystem: Lazy Storage Migration image

Laravel Read-Through Filesystem: Lazy Storage Migration

Read article