Laravel 8.47 Released


June 17th, 2021

Laravel 8.47 Released

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:

1// works in previous releases
4// works as of 8.47

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:

1$this->app->scoped('service', function (){
2 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:

1$assert = AssertableJson::fromArray([
2 'foo' => [1,2,3],
3 'bar' => 'baz',
6// Passes:
7$assert->whereHas('foo', 1);
8$assert->whereHas('foo', [2,3]);
9$assert->whereHas('bar', 'baz');
11// Fails:
12$assert->whereHas('foo', '1'); // Property [foo] does not contain [1].
13$assert->whereHas('foo', 4); // Property [foo] does not contain [4].
14$assert->whereHas('foo', [3,4]); // Property [foo] does not contain [4].
15$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:

1// Before
2$posts = App\Models\Post::search('Laravel')->paginate();
5// After
7 ->paginate()
8 ->tap(function ($posts) {
9 $posts->load('author');
10 });

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:



  • 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)



  • 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)

Filed in:

Paul Redmond

Full stack web developer. Author of Lumen Programming Guide and Docker for PHP Developers.