How to use the enumerations(Enums) of PHP 8.1 in Laravel?
The release of PHP 8.1 brings native enumerations to PHP. There is no more requirement for custom solutions in your Laravel projects since the Laravel v8.69 release has you back.
We'll take a straightforward example of a Post
model. This Post
model has the property status
, and its possible values can be draft
, in_review
, or published
. As it will be stored in the database, we will create a backed Enum. It implies that each enum case is associated with a string.
<?php
namespace App\Enums;
enum PostStatus: string
{
case Draft = "draft";
case InReview = "in_review";
case Published = "published";
}
Now here comes the great part. In Laravel v8.69, it allows us for casting Enums. We can use the new casting in the Post model, and it allows a status attribute to be cast to/from an Enum:
<?php
namespace App\Models;
use App\Enums\PostStatus;
use Illuminate\Database\Eloquent\Model;
class Post extends Model
{
protected $casts = [
'status' => PostStatus::class
];
}
It will cast the post status to Enum when interacting with the status attribute:
dd($post->status);
/*
App\Enums\PostStatus {
name: "Published",
value: "published",
}
*/
The status attribute is cast to Enum, So you can access the backed value stored in the database if needed like so:
echo $post->status->value; // published
Or, in the Post
model, you can add a method to compare status to the Enum directly:
public function isDraft()
{
return $this->status === PostStatus::Draft;
}
public function isPublished()
{
return $this->status === PostStatus::Published;
}
Create or Update Model
If you try to create or update a Post with an invalid status value, in that case, you will get PHP Fatal error:
$post->update(['status' => 'xyz']);
/* Fatal Error: "xyz" is not a valid backing value for enum ... */
Validation rule
When you are updating or creating model status, its value is coming from the Form request. Then, it is important to validate the request to make sure an input contains a valid enum value.
Here is the example
Laravel v8.69 provides the Enum
rule, a class-based rule that validates whether the field under validation contains a valid enum value:
use App\Enums\PostStatus;
use Illuminate\Validation\Rules\Enum;
$request->validate([
'status' => [new Enum(PostStatus::class)],
]);
Now your request only accepts enum’s backed values.
Please login or create new account to add your comment.