Comprendre et utiliser le pattern decorator en PHP et Symfony

Maîtrisez le pattern decorator en PHP et Symfony avec cet article détaillé et pratique.

Jérémy 🤘
Jérémy 🤘

Le pattern decorator est un modèle de conception puissant que tu peux utiliser dans ton code pour ajouter dynamiquement des fonctionnalités à des objets. En PHP et Symfony, ce modèle est particulièrement pertinent car il favorise la flexibilité et la réutilisabilité du code.

Qu'est-ce que le pattern decorator ?

Le pattern decorator permet d'ajouter de nouvelles responsabilités à un objet statique ou à une classe sans altérer son comportement de base. Tu peux le considérer comme un moyen de "décorer" un objet avec des fonctionnalités supplémentaires.

Avantages du pattern decorator

  • Flexibilité : tu peux ajouter ou supprimer des comportements à la volée.
  • Simplicité : il encourage une structure de code plus prise en charge.
  • Extensibilité : il minimise les modifications dans les classes existantes.

Comment implémenter le pattern decorator en PHP

Voici un exemple de code simple pour illustrer comment utiliser le pattern decorator en PHP.

Copier
// Interface de base
interface Beverage {
    public function cost();
}

// Classe concrète
class Coffee implements Beverage {
    public function cost() {
        return 5;
    }
}

// Decorator de base
abstract class BeverageDecorator implements Beverage {

    protected $beverage;

    public function __construct(Beverage $beverage) {
        $this->beverage = $beverage;
    }
}

// Decorator concret
class MilkDecorator extends BeverageDecorator {
    public function cost() {
        return $this->beverage->cost() + 2;
    }
}

// Utilisation
$coffee = new Coffee();
$milkCoffee = new MilkDecorator($coffee);
echo "Coût du café avec lait : " . $milkCoffee->cost(); // Affiche : Coût du café avec lait : 7
// Interface de base
interface Beverage {
    public function cost();
}

// Classe concrète
class Coffee implements Beverage {
    public function cost() {
        return 5;
    }
}

// Decorator de base
abstract class BeverageDecorator implements Beverage {

    protected $beverage;

    public function __construct(Beverage $beverage) {
        $this->beverage = $beverage;
    }
}

// Decorator concret
class MilkDecorator extends BeverageDecorator {
    public function cost() {
        return $this->beverage->cost() + 2;
    }
}

// Utilisation
$coffee = new Coffee();
$milkCoffee = new MilkDecorator($coffee);
echo "Coût du café avec lait : " . $milkCoffee->cost(); // Affiche : Coût du café avec lait : 7

Cet exemple montre comment ajouter du lait à un café tout en utilisant le pattern decorator. Le prix total du café est calculé dynamiquement.

Utilisation du pattern decorator avec Symfony

Dans Symfony, la mise en œuvre du pattern decorator se fait souvent dans les services. Voici comment tu peux procéder. Imaginons que tu aies un service de notification que tu souhaites "décorer" avec une fonction de logging.

Copier
// Service de notification
class NotificationService {
    public function notify($message) {
        // Logique de notification ici
    }
}

// Decorator de notification
class LoggingNotificationDecorator extends NotificationService {

    private $innerService;

    public function __construct(NotificationService $service) {
        $this->innerService = $service;
    }

    public function notify($message) {
        // Logging ici
        error_log($message);
        $this->innerService->notify($message);
    }
}

// Utilisation dans un contrôleur
$notificationService = new LoggingNotificationDecorator(new NotificationService());
$notificationService->notify('Ceci est un message de test.');
// Service de notification
class NotificationService {
    public function notify($message) {
        // Logique de notification ici
    }
}

// Decorator de notification
class LoggingNotificationDecorator extends NotificationService {

    private $innerService;

    public function __construct(NotificationService $service) {
        $this->innerService = $service;
    }

    public function notify($message) {
        // Logging ici
        error_log($message);
        $this->innerService->notify($message);
    }
}

// Utilisation dans un contrôleur
$notificationService = new LoggingNotificationDecorator(new NotificationService());
$notificationService->notify('Ceci est un message de test.');

Ce code montre comment tu peux créer un service de notification qui enregistre chaque message envoyé par le service d’origine.

Conclusion

Le pattern decorator te permet de concevoir des systèmes flexibles et extensibles. En l'utilisant dans tes projets PHP et Symfony, tu es en mesure d'ajouter facilement de nouvelles fonctionnalités sans perturber ton code existant. De cette façon, tu promouvois la réutilisabilité et la réduction des modifications de code.

En résumé, que tu développes des applications simples ou complexes, garder en tête le pattern decorator te permettra d'améliorer la qualité de ton code et sa maintenabilité.

Sources