Featured blog image
597 words 4 min read

Laravel Enum A Complete Guide to Usage and Code Quality

Why Has Enum Become an Essential Part of Modern Laravel Architecture?

Enum is a feature introduced in PHP 8.1, providing a structured way to define a set of fixed values as a single entity instead of relying on scattered strings or integers across the project. The goal: cleaner code, fewer errors, and easier maintenance.


First: Why Are Enums Important?

1) Values Become Real Entities in the Project

Before Enum, you handled random strings like 'pending'. Now, these values become a real data type that the IDE can understand, providing auto-completion and preventing errors.

<?php
enum OrderStatus: string {
    case PENDING = 'pending';
    case PROCESSING = 'processing';
    case COMPLETED = 'completed';
    case CANCELED = 'canceled';
}


2) Preventing Errors Caused by "Magic Strings"

Manually writing repeated string values leads to typos that are difficult to track. Enum forces you to use predefined, safe values only.

// Possible typo error
if ($order->status === 'pendng') { /* error */ }

// With Enum — safe and clear
if ($order->status === OrderStatus::PENDING) {
    // execution logic
}


3) Organizing All Values in One Place

Grouping values inside a single Enum file makes searching, editing, or adding new values easier without modifying multiple areas of the codebase.

enum UserType: string {
    case ADMIN = 'admin';
    case CLIENT = 'client';
    case MARKETER = 'marketer';
}

Second: Enum Integration with Laravel — Practical Examples

1) Casting in the Model

The strongest integration: converting the database column into an Enum automatically using $casts. This means any interaction with the field becomes Enum instead of a plain string.

class Order extends Model
{
    protected $casts = [
        'status' => OrderStatus::class,
    ];
}

// Later usage
if ($order->status === OrderStatus::COMPLETED) {
    // logic
}


2) Using Enum in Controllers and Services

Assigning and reading values using Enum makes intent clear and reduces errors.

$order->status = OrderStatus::PROCESSING;
$order->save();


3) Validation Using Enum

Laravel allows validating incoming values to ensure they match the allowed Enum values.

$request->validate([
    'status' => ['required', new \Illuminate\Validation\Rules\Enum(OrderStatus::class)],
]);


4) Using Enum in Switch Cases

It makes control flow cleaner and more readable compared to string comparisons.

switch ($order->status) {
    case OrderStatus::PENDING:
        // waiting logic
        break;

    case OrderStatus::COMPLETED:
        // completion logic
        break;
}


5) Adding Methods Inside Enum

An Enum can contain helper methods (e.g., label, cssClass), making it an intelligent self-managed entity.

enum OrderStatus: string
{
    case PENDING = 'pending';
    case COMPLETED = 'completed';

    public function label(): string
    {
        return match ($this) {
            self::PENDING => 'Pending Approval',
            self::COMPLETED => 'Completed',
        };
    }
}

// Usage
echo $order->status->label();

Third: Quick Comparison — Enum vs Constants

  • Constants: Useful but simply static text values inside a class, lacking type-safety or internal methods.
  • Enums: A full data type, supports methods, works seamlessly with validation, and the IDE provides better assistance.
// Constants (traditional approach)
class OrderStatuses {
    public const PENDING = 'pending';
    public const COMPLETED = 'completed';
}

// Enum (modern and recommended)
enum OrderStatus: string {
    case PENDING = 'pending';
    case COMPLETED = 'completed';
}

Fourth: When Should You Use Enum? And When Not?

  • Use Enum when you have fixed, predefined values: order status, user roles, payment methods, notification types, etc.
  • Do NOT use Enum for dynamic values controlled by admin panels or database entries editable by non-developers.

Fifth: Practical Tips to Improve Code Quality Using Enum

  • Keep Enums inside a clean directory structure like app/Enums.
  • Use model casting to avoid string comparisons.
  • Add helper methods inside Enum (label, cssClass, toArray) to centralize representation logic.
  • Use Enum in validation to ensure consistent and safe input values.
  • When working with APIs, convert Enum to explicit string or numeric values in Resources.
// Example: Transforming Enum inside an API Resource
public function toArray($request)
{
    return [
        'id' => $this->id,
        'status' => $this->status->value,
        'status_label' => $this->status->label(),
    ];
}

Share Now ?
Let's chat