How to use the enumerations(Enums) of PHP 8.1 in Laravel?

Harish Kumar · · 6749 Views

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.

0

Please login or create new account to add your comment.

0 comments
You may also like:

What's New in PHP 8.3? Your Guide to the Latest Features and Enhancements

PHP, the popular scripting language, continues its evolution with the major release of PHP 8.3. This update, though categorized as a minor release, brings a plethora of new features (...)
Harish Kumar

Laravel Facades: Simplifying Code and Improve Readability

As an integral part of Laravel, a renowned PHP framework, Facades provide a static interface to classes stored in the application's service container. They serve as static proxies (...)
Harish Kumar

A Comprehensive Guide to #[Override] Attribute in PHP 8.3

PHP 8.3 has ushered in an array of advanced features, among which the  #[Override] attribute stands out. This attribute, while known in other languages, is a fresh addition to (...)
Harish Kumar

What is Laravel’s Service Container and How to Use Dependency Injection in Laravel App

Dependency injection and inversion of control are vital in clean web development. They make writing maintainable, testable code possible. Laravel is a famous PHP framework that (...)
Harish Kumar

Secure Your SPA with Laravel Sanctum: A Step-by-Step Guide

In today's web development landscape, Single Page Applications (SPAs) are increasingly popular. But securing their interaction with backend APIs is crucial. Laravel Sanctum provides (...)
Harish Kumar

Multi-Authentication with Guards in Laravel

Laravel's robust authentication system provides a powerful mechanism for securing your application. To cater to scenarios where you need different user roles with distinct login (...)
Harish Kumar