Laravel 8.69 Released
Published on by Paul Redmond
The Laravel team released 8.69 with enum model casts, an enum validation rule, mask() method for Str and Stringable, and the latest changes in the v8.x branch.
Enum Model Casts
Mohamed Said contributed the ability for models to be cast to/from an Enum starting in PHP 8.1.
Here's an example from the pull request tests:
enum StringStatus: string{ case pending = 'pending'; case done = 'done';} enum IntegerStatus: int{ case pending = 1; case done = 2;} // Modelclass EloquentModelEnumCastingTestModel extends Model{ public $timestamps = false; protected $guarded = []; protected $table = 'enum_casts'; public $casts = [ 'string_status' => StringStatus::class, 'integer_status' => IntegerStatus::class, ];}
Then you can compare the model to the Enum value in your code, for example:
if ($server->status == ServerStatus::provisioned){ // ...}
Enum Validation Rule
Mohamed Said contributed an enum
validation rule that ensures the data has a corresponding value in the Enum:
validator( ['status' => 'pending'], ['status' => [new Enum(ServerStatus::class)]])->validate();
Use a Callback in During an Auth Attempt
@Italo contributed the ability to use a callback in the credentials array of an Auth::attempt()
call:
Auth::attempt([ 'email' => 'john@doe.com', function ($builder) { $builder->where('subscription_expires_at', '<', now()); }]);
Mask Support for Str and Stringable
@Italo contributed a mask()
method that masks a portion of a string with a repeated character:
Str::mask('my-private@email.com', '*', 3);// my****************** Str::mask('+56 9 87654321', '*', -8, 6);// + 56 9 ******21
Custom Stringable Cast
Louis-Gabriel contributed a custom AsStringable
cast that casts a string into a Stringable
instance:
// Illuminate\Support\Stringable instance$model->title->kebab();
Check out Pull Request #39410 for implementation details.
Skip Locked Support for MariaDB
Dries Vints contributed SKIP LOCKED
support to the MariaDB (MySQL) engine. This update provides support for skipping locked rows when fetching records from the database.
Check out Pull Request #39396 for implantation details.
Success and Failure Command Assertions
Roberto Aguilar contributed a few convenience assertions for command exit codes within tests:
// Before$this->artisan(FooCommand::class)->assertExitCode(0);$this->artisan(FooCommand::class)->assertExitCode(1); // Using optional convenience methods$this->artisan(FooCommand::class)->assertSuccessful();// Assert exit code !== success (0)$this->artisan(FooCommand::class)->assertFailed();
Release Notes
You can see the complete list of new features and updates below and the diff between 8.68.0 and 8.69.0 on GitHub. The following release notes are directly from the changelog:
v8.69.0
Added
- Improve content negotiation for exception handling (#39385)
- Added support for SKIP LOCKED to MariaDB (#39396)
- Custom cast string into Stringable (#39410)
- Added
Illuminate/Support/Str::mask()
(#39393) - Allow model attributes to be casted to/from an Enum (#39315)
- Added an Enum validation rule (#39437)
- Auth: Allows to use a callback in credentials array (#39420)
- Added success and failure command assertions (#39435)
Fixed
- Fixed CURRENT_TIMESTAMP as default when changing column (#39377)
- Make accept header comparison case-insensitive (#39413)
- Fixed regression with capitalizing translation params (#39424)
Changed
- Added bound check to env resolving in
Illuminate/Foundation/Application::runningUnitTests()
(#39434)