The Laravel team released v12.9.0, which includes a memoized cache driver, convenient relationship autoloading for a model instance, a DB transaction failure callback, and more:
Memoized Cache Driver
Tim MacDonald contributed a memoized cached driver which decorates any other cache driver in memory:
We put things in the cache because the cache is fast; that doesn't mean hitting the cache is free.
This PR introduces a memoized cache driver. This new driver is a decorator around other cache drivers. It will remember values resolved from the cache and store them in memory for the remainder of the execution.
Cache::get('foo'); // hits the cacheCache::get('foo'); // hits the cacheCache::get('foo'); // hits the cache Cache::memo()->get('foo'); // hits the cacheCache::memo()->get('foo'); // does not hit the cacheCache::memo()->get('foo'); // does not hit the cache
Check out the cache documentation to learn more about memoization. Also, check out Pull Request #55304 for full details and discussion around this feature.
Freeze Time Test Updates
Jason McCreary contributed an update to the freezeTime()
and freezeSecond()
test methods, which now return the date if no callback is provided:
This PR aims to provide that by updating Laravel's freezeTime and freezeSecond to return the "frozen time" when not passed a callback. The above example may now be written as follows and passes out-of-the-box, providing a smoother testing DX free of time gotchas.
// Before$now = now();Carbon::setTestNow($now); $post->slug = $slug;$post->save(); $package->refresh();$this->assertTrue($now->equalTo($post->updated_at)); // After$now = $this->freezeSecond(); $post->slug = $slug;$post->save(); $package->refresh();$this->assertTrue($now->equalTo($post->updated_at));
See Pull Request #55323 for discussion and implementation.
Add a Callback for DB Transaction Failures
Davey Shafik contributed a new argument to the DB::transaction()
method that allows you to pass a callback to be executed when the transaction fails:
DB::transaction( callback: function () { // do DB stuff }, onFailure: function () { Notification::send($admin, new SomethingImportantBroke()); });
Model Relationship Autoloading from a Model
Serhii Litvinchuk contributed model relationship autoloading:
In the current implementation #53655 Automatic Relation Loading we can only use withRelationshipAutoloading only on collections.
Sometimes we need to enable automatic relation loading for single model:
// Before$post->tags->withRelationshipAutoloading();$post->authors->withRelationshipAutoloading(); // After$post->withRelationshipAutoloading();
Add Descriptive Error Messages to assertViewHas()
@3Descape contributed an update to error messages when using assertViewHas()
. Given the following example from the pull request:
$response->assertViewHasAll([ 'key_without_value', 'key_with_value' => 10, 'key_with_closure' => fn ($value) => $value == 10, 'key_with_model' => Customer::first(), 'key_with_collection' => Customer::factory()->count(10)->create(),]);
Before, you would get a generic error message for an assertion failure, but now you'll get more informative details to help you understand what failed:
# Before1) Tests\Feature\App\Http\CustomerControllerTest::a_test_exampleFailed asserting that false is true. # After1) Tests\Feature\App\Http\CustomerControllerTest::a_test_exampleFailed asserting that 'key_with_value' matches the expected value.Failed asserting that 0 matches expected 10.
Fluent make() Method
Michael Nabil contributed a Fluent::make()
method to create a fluent instance:
use Illuminate\Support\Fluent; $instance = Fluent::make($attributes);
Release notes
You can see the complete list of new features and updates below and the diff between 12.8.0 and 12.9.0 on GitHub. The following release notes are directly from the changelog:
v12.9.0
- Add types to ViewErrorBag by @AJenbo in https://github.com/laravel/framework/pull/55329
- Add types to MessageBag by @AJenbo in https://github.com/laravel/framework/pull/55327
- [12.x] add generics to commonly used methods in Schema/Builder by @taka-oyama in https://github.com/laravel/framework/pull/55330
- Return frozen time for easier testing by @jasonmccreary in https://github.com/laravel/framework/pull/55323
- Enhance DetectsLostConnections to Support AWS Aurora Credential Rotation Scenario by @msaifmfz in https://github.com/laravel/framework/pull/55331
- [12.x] Rename test method of failedRequest() by @LKaemmerling in https://github.com/laravel/framework/pull/55332
- feat: Add a callback to be called on transaction failure by @dshafik in https://github.com/laravel/framework/pull/55338
- [12.x] Add withRelationshipAutoloading method to model by @litvinchuk in https://github.com/laravel/framework/pull/55344
- [12.x] Enable HTTP client retries when middleware throws an exception by @27pchrisl in https://github.com/laravel/framework/pull/55343
- [12.x] Fix Closure serialization error in automatic relation loading by @litvinchuk in https://github.com/laravel/framework/pull/55345
- Add test for Unique validation rule with WhereIn constraints by @mohammadrasoulasghari in https://github.com/laravel/framework/pull/55351
- Add @throws in doc-blocks by @mohammadrasoulasghari in https://github.com/laravel/framework/pull/55361
- [12.x] Update
propagateRelationAutoloadCallbackToRelation
method doc-block by @derian-all-win-software in https://github.com/laravel/framework/pull/55363 - [12.x] - Redis - Establish connection first, before set the options by @alexmontoanelli in https://github.com/laravel/framework/pull/55370
- [12.x] Fix translation FileLoader overrides with a missing key by @fabio-ivona in https://github.com/laravel/framework/pull/55342
- [12.x] Fix pivot model events not working when using the
withPivotValue
by @amir9480 in https://github.com/laravel/framework/pull/55280 - [12.x] Introduce memoized cache driver by @timacdonald in https://github.com/laravel/framework/pull/55304
- [12.x] Add test for Filesystem::lastModified() method by @roshandelpoor in https://github.com/laravel/framework/pull/55389
- [12.x] Supports
pda/pheanstalk
7 by @crynobone in https://github.com/laravel/framework/pull/55397 - [12.x] Add comprehensive filesystem operation tests to FilesystemTest by @roshandelpoor in https://github.com/laravel/framework/pull/55399
- Bump vite from 5.4.17 to 5.4.18 in /src/Illuminate/Foundation/resources/exceptions/renderer by @dependabot in https://github.com/laravel/framework/pull/55402
- Add descriptive error messages to assertViewHas() by @3Descape in https://github.com/laravel/framework/pull/55392
- Use Generic Types Annotations for LazyCollection Methods by @mohammadrasoulasghari in https://github.com/laravel/framework/pull/55380
- [12.x] Add test coverage for Process sequence with multiple env variables by @roshandelpoor in https://github.com/laravel/framework/pull/55406
- [12.x] Fix cc/bcc/replyTo address merging in
MailMessage
by @onlime in https://github.com/laravel/framework/pull/55404 - [12.x] Add a
make
function in theFluent
by @michaelnabil230 in https://github.com/laravel/framework/pull/55417