Chaperone, Defer, Cache::flexible, and more are now available in Laravel 11.23
Published on by Paul Redmond
The Laravel team released v11.23 this week, with the Laracon US 2024 open-source updates like defer()
, concurrency, contextual container attritubes, and more.
Laracon 2024 Updates
Taylor Otwell contributed all of the goodies he shared in his Laracon US 2024 keynote, including chaperone()
, defer()
, Cache::flexible()
, contextual container attributes, and more.
The documentation is being updated; here are a few highlights you should check out to get familiar with these updates:
- Concurrency Documentation
- Container Contextual Attributes
-
Automatically Hydrating Parent Models on Children (AKA
chaperone()
) - Helpers: Deferred Functions
See Pull Request #52710 for full details on everything added related to Taylor's .
Add minRatio and maxRatio Rules to Dimension Validation
Cam Kemshal-Bell added min and max ratio to the dimensions
validation rule:
You can use these methods fluently, using minRatio()
, maxRatio()
, and ratioBetween()
:
use Illuminate\Validation\Rule; //// Using minRatio and maxRatio fluent methods//Rule::dimensions() ->minRatio(1 / 2) ->maxRatio(1 / 3);// dimensions:min_ratio=0.5,max_ratio=0.33333333333333 //// Equivalent using ratioBetween()//Rule::dimensions()->ratioBetween(min: 1 / 2, max: 1 / 3); // dimensions:min_ratio=0.5,max_ratio=0.33333333333333
You can also use the string style dimensions
rule with this update as well:
use Illuminate\Support\Facades\Validator; Validator::make($request->all(), [ 'min_12' => 'dimensions:min_ratio=1/2', 'square' => 'dimensions:ratio=1', 'max_25' => 'dimensions:max_ratio=2/5', 'min_max' => 'dimensions:min_ratio=1/4,max_ratio=2/5',]);
Backed Enum Support in Gate Methods and Authorize Middleware
Diaa Fares contributed two pull requests that continue to add backed enum support. This release includes updates to the Gate
methods and Authorize
middleware.
Here are some examples of using Enums with Gate
methods:
enum Abilities: string { case VIEW_DASHBOARD = 'view-dashboard'; case EDIT = 'edit'; case UPDATE = 'update';} // BeforeGate::define('view-dashboard', function (User $user) { return $user->isAdmin;}); Gate::authorize('view-dashboard');Gate::inspect('view-dashboard');Gate::check('view-dashboard');Gate::any(['edit', 'update], $post);Gate::none(['edit', 'update]], $post);Gate::allows('update', $post);Gate::denies('update', $post); // AfterGate::define(Abilities::VIEW_DASHBOARD, function (User $user) { return $user->isAdmin;}); Gate::authorize(Abilities::VIEW_DASHBOARD);Gate::inspect(Abilities::VIEW_DASHBOARD);Gate::check(Abilities::VIEW_DASHBOARD);Gate::any([Abilities::EDIT, Abilities::UPDATE], $post);Gate::none([Abilities::EDIT, Abilities::UPDATE], $post);Gate::allows(Abilities::UPDATE, $post);Gate::denies(Abilities::UPDATE, $post);
Here's an example of the Authorize
middleware's support for backed enums:
Route::get('/dashboard', [AdminDashboardController::class, 'index']) ->middleware( Authorize::using(Abilities::VIEW_DASHBOARD) ) ->name(AdminRoutes::DASHBOARD);
Skip Middleware for Queue Jobs
Kennedy Tedesco contributed a Skip middleware to skip a job based on a condition. This middleware has three static constructor methods you can use, including when()
, unless()
. The job is skipped based on the result of the condition used:
class MyJob implements ShouldQueue{ use Queueable; public function handle(): void { // TODO } public function middleware(): array { return [ Skip::when($someCondition), // Skip when `true` Skip::unless($someCondition), // Skip when `false` Skip::when(function(): bool { if ($someCondition) { return true; } return false; }), ]; }}
findOrFail()
Method
Eloquent Collection Steve Bauman contributed a findOrFail()
method on Eloquent collections that adds a way to find a model on an already populated collection:
$users = User::get(); // [User(id: 1), User(id: 2)] $users->findOrFail(1); // User $user->findOrFail([]); // [] $user->findOrFail([1, 2]); // [User, User] $user->findOrFail(3); // ModelNotFoundException: 'No query results for model [User] 3' $user->findOrFail([1, 2, 3]); // ModelNotFoundException: 'No query results for model [User] 3'
Release notes
You can see the complete list of new features and updates below and the diff between 11.22.0 and 11.23.0 on GitHub. The following release notes are directly from the changelog:
v11.23.0
- [11.x] Fix $fail closure type in docblocks for validation rules by @bastien-phi in https://github.com/laravel/framework/pull/52644
- [11.x] Add MSSQL 2017 and PGSQL 10 builds by @driesvints in https://github.com/laravel/framework/pull/52631
- Update
everyThirtyMinutes
cron expression by @SamuelNitsche in https://github.com/laravel/framework/pull/52662 - Bump micromatch from 4.0.5 to 4.0.8 in /src/Illuminate/Foundation/resources/exceptions/renderer by @dependabot in https://github.com/laravel/framework/pull/52664
- [11.x] apply excludeUnvalidatedArrayKeys to list validation by @lorenzolosa in https://github.com/laravel/framework/pull/52658
- [11.x] Adding minRatio & maxRatio rules on Dimension validation ruleset by @CamKem in https://github.com/laravel/framework/pull/52482
- [11.x] Add BackedEnum support to Authorize middleware by @diaafares in https://github.com/laravel/framework/pull/52679
- [11.x] Add BackedEnum support to Gate methods by @diaafares in https://github.com/laravel/framework/pull/52677
- [11.x] Suggest serializable-closure by @driesvints in https://github.com/laravel/framework/pull/52673
- [11.x] Fix alter table expressions on SQLite by @hafezdivandari in https://github.com/laravel/framework/pull/52678
- [11.x] Add Exceptions\Handler::mapLogLevel(...) so the logic can be easily overridden by @taka-oyama in https://github.com/laravel/framework/pull/52666
- [11.x] Bugfix for calling pluck() on chaperoned relations. by @samlev in https://github.com/laravel/framework/pull/52680
- [11.x] Fix build failures due to enum collide After adding BackedEnum support to Gate by @diaafares in https://github.com/laravel/framework/pull/52683
- Fixing Str::trim to remove the default trim/ltrim/rtim characters " \n\r\t\v\0" by @mathiasgrimm in https://github.com/laravel/framework/pull/52684
- [11.x] Add
Skip
middleware for Queue Jobs by @KennedyTedesco in https://github.com/laravel/framework/pull/52645 - [11.x] Fix etag headers for binary file responses by @wouterrutgers in https://github.com/laravel/framework/pull/52705
- [11.x] add
withoutDelay()
to PendingDispatch by @KennedyTedesco in https://github.com/laravel/framework/pull/52696 - [11.x] Refactor
Container::getInstance()
to use null coalescing assignment by @xurshudyan in https://github.com/laravel/framework/pull/52693 - [11.x] Removed unnecessary call to setAccessible(true) by @xurshudyan in https://github.com/laravel/framework/pull/52691
- [11.x] Add
Eloquent\Collection::findOrFail
by @stevebauman in https://github.com/laravel/framework/pull/52690 - [11.x] PHPStan Improvements by @crynobone in https://github.com/laravel/framework/pull/52712
- [11.x] Fix Collection PHPDoc by @staudenmeir in https://github.com/laravel/framework/pull/52724
- [11.x] Add optional parameter for
confirmed
validator rule by @jwpage in https://github.com/laravel/framework/pull/52722 - [11.x] Test Improvements by @crynobone in https://github.com/laravel/framework/pull/52718
- [11.x] Fix incorrect variable-length argument
$guards
from array to string by @kayw-geek in https://github.com/laravel/framework/pull/52719 - Allow testing of relative signed routes by @shealavington in https://github.com/laravel/framework/pull/52726
- [11.x] fix: Builder::with closure types by @calebdw in https://github.com/laravel/framework/pull/52729
- Laracon 2024 by @taylorotwell in https://github.com/laravel/framework/pull/52710
- Add
Tag
attribute by @TijmenWierenga in https://github.com/laravel/framework/pull/52743 - [11.x] Adds BackedEnum to PendingDispatch's phpDoc for onQueue, allOnQueue, onConnection, allOnConnection methods by @sethsandaru in https://github.com/laravel/framework/pull/52739
- New when() helper. by @danmatthews in https://github.com/laravel/framework/pull/52665
- [11.x] Add
fromUrl()
to Attachment by @KennedyTedesco in https://github.com/laravel/framework/pull/52688