Laravel Intermédiaire

Comment utiliser les enums avec Laravel

Maîtrisez les enums dans Laravel pour un code robuste, lisible et maintenable : casts, scopes, et gestion SQL simplifiés.

5 minutes de lecture

Guide complet pour utiliser les Enums dans Laravel

Les enums sont désormais une pratique essentielle pour gérer des valeurs fixes, assurant ainsi la robustesse et la fiabilité de votre code. Ils permettent d’éviter les erreurs de type ou les valeurs inattendues en encapsulant simplement des options prédéfinies. Dans cet article, découvrez comment exploiter efficacement les enums dans Laravel, que ce soit via le casting sur les modèles, leur utilisation dans les scopes, ou leur gestion lors des migrations de la base de données.

Introduction aux enums dans Laravel

Laravel, framework PHP très prisé, facilite la gestion des types de données grâce à son système d’Eloquent Casts. Depuis PHP 8.1, l’utilisation native des enums offre une façon claire et structurée de définir des valeurs prédéfinies pour des attributs. Intégrer les enums dans Laravel améliore la maintenabilité, la lisibilité et la sécurité de votre code, tout en rendant les processus plus cohérents et intuitifs.

Utiliser les enums avec le casting dans les modèles

La méthode la plus simple pour gérer des valeurs énumérées dans Laravel consiste à utiliser le système de casts de Eloquent. Avec PHP 8.1, vous pouvez caster directement un attribut en enum, simplifiant ainsi la manipulation sans conversions manuelles ou vérifications répétitives.

Créer un enum

Commencez par définir votre enum PHP en utilisant la syntaxe native :

<?php
namespace App\Enums;

enum Status: string
{
  case PENDING = 'pending';
  case APPROVED = 'approved';
  case REJECTED = 'rejected';
}

Appliquer le cast dans le modèle

Dans votre modèle Eloquent, indiquez le casting de l’attribut en utilisant la classe enum :

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use App\Enums\Status;

class Commande extends Model
{
    protected $casts = [
        'statut' => Status::class,
    ];
}

Après cette configuration, chaque fois que vous accédez à l’attribut statut, Laravel retourne une instance de l’enum, ce qui facilite l’accès à ses valeurs ou cases :

$commande = Commande::find(1);
echo $commande->statut->value; // affiche 'pending'
if ($commande->statut === Status::APPROVED) {
    // effectuer une action spécifique
}

Ce système automatise la conversion d’enum en valeur primitive lors des opérations en base de données, rendant le code plus clair et moins sujet aux erreurs.

Utilisation des enums dans les scopes Eloquent

Les enums peuvent parfois poser problème lors de l’écriture de scopes, particulièrement pour les comparisons directes. Laravel fournit une solution élégante : grâce au cast, vous pouvez utiliser les enums directement dans vos requêtes sans manipuler leur valeur sous-jacente.

Exemple de scope personnalisé

Supposons que vous souhaitez filtrer des commandes selon leur statut. Vous pouvez définir un scope dans votre modèle :

public function scopeOfStatus($query, Status $status)
{
  return $query->where('statut', $status);
}

Ce scope s’utilise ainsi :

$commandesEnAttente = Commande::ofStatus(Status::PENDING)->get();

Grâce au cast, Laravel convertit automatiquement l’enum en sa valeur lors de l’exécution de la requête, puis reconvertit en enum lorsque vous récupérez le modèle. Cela simplifie considérablement la syntaxe et renforce la sécurité et la cohérence des opérations.

Gestion des enums dans les migrations de la base de données

La définition des enums au niveau de la base de données nécessite une attention particulière. Laravel permet d’utiliser le type enum dans les migrations, mais il est conseillé de ne pas faire référence directement à la classe enum pour maintenir la flexibilité et la fiabilité de votre code.

Créer une migration avec un champ enum

Voici un exemple pour définir un champ enum dans votre migration :

public function up()
{
    Schema::create('commandes', function (Blueprint $table) {
        $table->id();
        $table->string('reference');
        $table->enum('statut', ['pending', 'approved', 'rejected'])
              ->default('pending');
        $table->timestamps();
    });
}

Recommandations pour la maintenabilité

Il est préférable de ne pas utiliser la classe enum directement dans la migration, par exemple en évitant [VotreEnum::class]. En modifiant ou en ajoutant des valeurs dans l’enum PHP, vous devrez aussi mettre à jour la migration manuellement. Cela permet de séparer logiquement la structure de la base de la logique métier, ce qui facilite la maintenance à long terme.

Conseil pratique

Pour plus de flexibilité, vous pouvez définir vos champs sous forme de string ou varchar et gérer la validation ou la correspondance avec les enums dans votre code métier ou via des règles de validation dans Laravel.

Conclusion

Intégrer les enums dans Laravel contribue à rendre votre code plus robuste, clair et facile à maintenir. Le système de casting simplifie leur utilisation dans les modèles et les scopes, éliminant la nécessité de manipulations complexes de valeurs. En ce qui concerne la base de données, privilégiez la définition des champs enum avec des valeurs fixes et évitez de faire référence aux classes enum dans les migrations.

Contact

N'hésitez pas à me contacter pour échanger sur vos projets.