Comment créer et utiliser une ENUM dans Laravel ?

Une enum, abréviation de “enumeration”, est un type de données en programmation qui se compose d’un ensemble de valeurs nommées, souvent appelées membres ou éléments. Cela permet aux développeurs de définir une collection de constantes liées, rendant le code plus lisible et maintenable. Les enums sont couramment utilisées pour représenter des concepts comme les jours de la semaine, les mois ou les types de statut dans un programme.

Étape 1 : Installer Laravel 11

Si vous n’avez pas encore créé votre application Laravel, exécutez la commande suivante :
composer create-project --prefer-dist laravel/laravel laravel-dev dev-master

Étape 2 : Créer une migration

php artisan make:migration create_products_table
Créez une table products avec les colonnes name, body et status, et générez le modèle associé.
database/migrations/2024_03_03_141714_create_products_table.php
<?php
  
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
  
return new class extends Migration
{
    /**
     * Run the migrations.
     */
    public function up(): void
    {
        Schema::create('products', function (Blueprint $table) {
            $table->id();
            $table->string('name');
            $table->text('body');
            $table->string('status')->default('pending');
            $table->timestamps();
        });
    }
  
    /**
     * Reverse the migrations.
     */
    public function down(): void
    {
        Schema::dropIfExists('products');
    }
};
Exécutez la commande pour appliquer la migration :
php artisan migrate

Étape 3 : Créer une classe Enum

Utilisez la commande suivante pour créer l’énumération ProductStatus :
php artisan make:enum Enums/ProductStatus
app/Enums/ProductStatus.php
<?php
  
namespace App\Enums;
  
enum ProductStatus: string
{
    case Pending = 'pending';
    case Active = 'active';
    case Inactive = 'inactive';
    case Rejected = 'rejected';
}

Étape 4 : Créer un modèle

Ajoutez une conversion des attributs (casts) dans le modèle Product.
php artisan make:model Product
App/Models/Product.php
<?php
  
namespace App\Models;
  
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use App\Enums\ProductStatus;
  
class Product extends Model
{
    use HasFactory;
  
    /**
     * Write code on Method
     *
     * @return response()
     */
    protected $fillable = [
        'name', 'body', 'status'
    ];
    
    /**
     * Write code on Method
     *
     * @return response()
     */
    protected function casts(): array
    {
        return [
            'status' => ProductStatus::class,
        ];
    }
}
Étape 5 : Créer une route
Ajoutez une route pour tester l’énumération.
routes/web.php
<?php
  
use Illuminate\Support\Facades\Route;
  
use App\Http\Controllers\ProductController;

Route::get('/product-test', [ProductController::class, 'index']);
Étape 6 : Créer un contrôleur
Créez un contrôleur ProductController pour tester la création de produits avec une énumération.
app/Http/Controllers/ProductController.php
<?php
  
namespace App\Http\Controllers;
  
use Illuminate\Http\Request;
use App\Enums\ProductStatus;
use App\Models\Product;
  
class ProductController extends Controller
{
    /**
     * Write code on Method
     *
     * @return response()
     */
    public function index()
    {
        $input = [
            'name' => 'Gold',
            'body' => 'This is a Gold',
            'status' => ProductStatus::Active
        ];
    
        $product = Product::create($input);
    
        dd($product->status, $product->status->value);
    
    }
}
Étape 7 : Lancer l’application
Exécutez la commande suivante pour démarrer le serveur Laravel :
php artisan serve
Accédez à l’URL suivante dans votre navigateur pour voir le résultat :
http://localhost:8000/product-test
Résultat attendu
App\Enums\ProductStatusEnum {#1250 
name: "Active"
value: "active"
}
active
Vous pouvez désormais étendre ce concept pour gérer d’autres énumérations dans votre application.