Use PHP 8 Backed Enums to eliminate magic strings in database columns, query scopes, and form validation rules.
Hardcoding status strings like $order->status === 'pending' or User::where('role', 'admin') across multiple controllers makes refactoring difficult and introduces silent typo bugs that static analysis tools cannot catch.
PHP 8 Backed Enums provide type safety and IDE autocomplete.
Defining a Backed Enum
namespace App\Enums;
enum OrderStatus: string
{
case PENDING = 'pending';
case PROCESSING = 'processing';
case COMPLETED = 'completed';
case CANCELLED = 'cancelled';
public function label(): string
{
return match ($this) {
self::PENDING => 'Order Pending',
self::PROCESSING => 'In Processing',
self::COMPLETED => 'Order Completed',
self::CANCELLED => 'Cancelled',
};
}
}
Casting in Eloquent Models
namespace App\Models;
use App\Enums\OrderStatus;
use Illuminate\Database\Eloquent\Model;
class Order extends Model
{
protected function casts(): array
{
return [
'status' => OrderStatus::class,
];
}
}
Type-Safe Querying and Comparison
use App\Enums\OrderStatus;
// Type-safe query: No magic strings
$orders = Order::where('status', OrderStatus::PENDING)->get();
// Natural enum comparison
if ($order->status === OrderStatus::COMPLETED) {
// Process fulfillment
}
Summary
- Prevents typos and catches invalid status assignments during compilation.
- Provides native casting with Eloquent models via
casts(). - Bundles domain display labels and helper methods directly inside Enum classes.
Related Tips
View all tips →Execute Multi-Step Business Workflows with the Pipeline Facade
Use Laravel's Pipeline facade to pass objects through sequential pipe classes, keeping complex order processing and data transformations modular.
Follow Laravel Standard Naming Conventions for Predictable Architecture
A complete reference guide to Laravel community naming conventions across models, controllers, migrations, relationships, routes, views, enums, and tests.