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

Harish Kumar · · 6283 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:

Laravel Pint & VS Code: Automate Your Code Formatting

Laravel Pint is an opinionated PHP code style fixer built on top of PHP-CS-Fixer, designed to simplify the process of ensuring clean and consistent code style in Laravel projects. (...)
Harish Kumar

Best Practices for Testing and Quality Assurance in Custom Web App Development

In the fast-paced world of web app development, delivering high-quality products that meet customer expectations is crucial. But how can you ensure your custom web application (...)

PHP-CS-Fixer: The Ultimate Guide to PHP Code Formatting in VSCode

In this comprehensive guide, we will explore how to use PHP-CS-Fixer in VSCode to automate the process of PHP code formatting and adhere to the best coding practices.
Harish Kumar

Laravel Clockwork: A Deep Dive into Debugging, Profiling Skills and Best Practices

In the world of web development, building complex applications often comes with the challenge of identifying and resolving performance bottlenecks. This is where a reliable debugging (...)
Harish Kumar

Effortless PDF Generation in Laravel: A Guide to Using Spatie/Browsershot Package

Looking to generate or export PDF files using Laravel? Look no further! In this article, we'll guide you through using the Laravel spatie/browsershot package to seamlessly convert (...)
Harish Kumar

Learn PHP Development from beginning.

PHP stance Hypertext Preprocessor, it's server-side scripting laungage and easy to use. PHP  also well  known for its speed, simplicity, flexibility features that have made it (...)
Programmer Desk