Laravel 8.47 Released
Published on by Paul Redmond
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 releasesStr::of('xyz')->match('/(xyz)/'); // works as of 8.47Str::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'); // AfterApp\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()
andmatchAll()
methods toIlluminate/Support/Str.php
(#37642) - Copy password rule to current_password (#37650)
- Allow tap() on Paginator (#37682)
Revert
- Revert of “Columns in the order by list must be unique” (#37649)
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)