Laravel 9.40 Released
Published on by Paul Redmond
The Laravel team released 9.40 this week with a new lottery utility class, new validation rules, asserting a redirect to a named route, and more.
Lottery utility class
Tim MacDonald contributed a Lottery
support class that can be used in various settings, such as randomizing data sampling, failure reports, etc.
Here's an example of the basic API:
Lottery::odds(1, 10)->choose(); // returns `true` for "win"// returns `false` for "loss" Lottery::odds(1, 10) ->winner(fn () => 'winner') ->loser(fn () => 'loser') ->choose(); // returns `"winner"` for "win"// returns `"loser"` for "loss"
Here are a few Laravel-specific examples from the pull request, which is where Lottery could be used in tandem with other Laravel features. In the following example, the Lottery
chain of calls returns a callable
instance which you can register as a handler in various Laravel events:
// Randomly sample so we don't flood our error handler... DB::whenQueryingForLongerThan( Interval::seconds(2), Lottery::odds(1, 100)->winner(fn () => report('DB queries exceeded 2 seconds'))); // Randomly sample so we don't flood our error handler... Model::handleLazyLoadingViolationUsing(Lottery::odds(1, 5000)->winner(function ($model, $relation) { report(new LazyLoadingViolationException($model, $relation));}));
The Laravel helpers documentation has examples of how to use this class and how to test it as well.
Eloquent model observers listed in the model:show command
Mike Healy contributed an update to the model:show
command that lists model observers for a given model:
It also handles multiple observers attached to the same model action. Listing observers is helpful to quickly find listed observers for a model without hunting for service provider calls.
Lowercase and uppercase validation rules
Tim MacDonald contributed a lowercase
validation rule, which enforces that the validated input is lowercase. This could be useful when you don't want to change info on the user to lowercase silently, but you want to ensure they insert only lowercase. For example, an input to create a database user but forcing the user to be all lowercase.
Validator::make( ['name' => 'Admin'], ['name' => 'required|string|lowercase']);
Michael Nabil contributed an uppercase
validation rule which ensures the given input is in all uppercase letters:
Validator::make( ['name' => 'ADMIN'], ['name' => ['required', 'string', 'uppercase']);
Assert redirect to a route
Zaher Ghaibeh contributed an assertRedirectToRoute
method which you can use to assert that a response is a redirect to a given named route:
this->get('test-route') ->assertRedirectToRoute('named-route');
Save many models quietly
Niels contributed a saveManyQuietly
method for saving multiple models quietly for belongs to many and has one or many relationships.
$model->saveManyQuietly($relatedModels);
Release Notes
You can see the complete list of new features and updates below and the diff between 9.39.0 and 9.40.0 on GitHub. The following release notes are directly from the changelog:
v9.40.0
Added
- Include Eloquent Model Observers in model:show command (#44884)
- Added "lowercase" validation rule (#44883)
- Introduce
Lottery
class (#44894) - Added
/Illuminate/Testing/TestResponse::assertRedirectToRoute()
(#44926) - Add uppercase validation rule (#44918)
- Added saveManyQuietly to the hasOneOrMany and belongsToMany relations (#44913)
Fixed
- Fix HasAttributes::getMutatedAttributes for classes with constructor args (#44829)
Changed
- Remove argument assignment for console (#44888)
- Pass $maxExceptions from mailable to underlying job when queuing (#44903)
- Make Vite::isRunningHot public (#44900)
- Add method to be able to override the exception context format (#44895)
- Add zero-width space to trimmed characters in TrimStrings middleware (#44906)
- Show error if key:generate artisan command fails (#44927)
- Update database version check for lock popping for PlanetScale (#44925)
- Move function withoutTrashed into DatabaseRule (#44938)
- Use write connection on Schema::getColumnListing() and Schema::hasTable() for MySQL and PostgreSQL (#44946)