Digital solutions
Design Patterns avec Laravel

Proxy Pattern vs Mixin Pattern

1. Proxy Pattern

  • Contrôle d'accès et ajout de fonctionnalités : Utilisé pour intercepter les appels à un objet afin de contrôler l'accès ou ajouter des comportements supplémentaires comme la journalisation, la mise en cache, ou la gestion des permissions.
  • Structure : Le proxy agit comme un intermédiaire, déléguant les tâches à l'objet réel tout en ajoutant de la logique supplémentaire avant ou après l'appel.
  • Exemple dans Laravel : Utilisation d'un proxy pour intercepter des appels à une API externe et mettre en cache les résultats.

2. Mixin Pattern

  • Ajout dynamique de méthodes : Permet d'ajouter des méthodes à une classe à la volée sans modifier son code source ou utiliser l'héritage. Très flexible pour adapter ou étendre les fonctionnalités.
  • Structure : En PHP, souvent réalisé avec des traits comme Macroable qui permettent d'intercepter des méthodes non définies et d'ajouter des comportements dynamiques.
  • Exemple dans Laravel : Utilisation du trait Macroable pour ajouter dynamiquement des méthodes à des services comme Log ou des services personnalisés.

Comparaison directe :

Caractéristique Proxy Pattern Mixin Pattern
But principal Contrôler l'accès et ajouter des fonctionnalités supplémentaires. Ajouter dynamiquement des méthodes à une classe.
Encapsulation L'objet réel est encapsulé et contrôlé par le proxy. Les méthodes sont ajoutées à la classe directement à la volée.
Utilisation Utilisé pour contrôler ou intercepter des appels à un objet. Utilisé pour étendre dynamiquement les fonctionnalités d'une classe.
Exemple dans Laravel Proxy pour intercepter les appels API et ajouter du cache. Macroable pour ajouter des méthodes dynamiques à une classe de service.
Séparation des préoccupations Le proxy sépare les fonctionnalités supplémentaires de l'objet réel. Les comportements peuvent être ajoutés à la classe sans modifier son code.

Exemples

Imaginons un système de gestion d'API pour lequel nous voulons ajouter de la flexibilité et du contrôle dans l'accès aux données.

1. Proxy Pattern

Le proxy intercepte les appels à l'API et met en cache les résultats pour éviter les requêtes répétées.

class ApiService {
    public function fetchData($endpoint) {
        return Http::get($endpoint)->json();
    }
}

class ApiServiceProxy {
    private $realService;

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

    public function fetchData($endpoint) {
        return Cache::remember("api_{$endpoint}", 600, function() use ($endpoint) {
            return $this->realService->fetchData($endpoint);
        });
    }
}

$service = new ApiServiceProxy(new ApiService());
$service->fetchData('https://api.example.com/data');

2. Mixin Pattern

Nous utilisons un mixin pour ajouter dynamiquement une méthode d'authentification à un service d'API.

use Illuminate\Support\Traits\Macroable;

class ApiService {
    use Macroable;
}

ApiService::macro('authenticate', function($token) {
    return "Authenticated with token: $token";
});

$service = new ApiService();
echo $service->authenticate('12345');  // Affiche "Authenticated with token: 12345"

Explications

  • Proxy Pattern : L'accent est mis sur le contrôle de l'accès à un objet et l'ajout de fonctionnalités comme la mise en cache. Il agit comme un intermédiaire pour l'objet réel, encapsulant la logique supplémentaire tout en déléguant les appels à l'objet d'origine.
  • Mixin Pattern : Ici, le focus est sur la flexibilité d'extension des fonctionnalités d'une classe à la volée, sans avoir besoin de modifier son code source ou d'utiliser l'héritage.

Cas d'utilisation des patterns

  • Proxy Pattern : Idéal pour les systèmes où le contrôle d'accès, la gestion des permissions, ou la journalisation est cruciale, comme l'interception d'appels API avec gestion du cache ou contrôle de la sécurité.
  • Mixin Pattern : Parfait pour ajouter des méthodes ou comportements dynamiques à une classe sans devoir la modifier directement, comme ajouter des méthodes de manipulation dans des services existants.

Conclusion

  • Le Proxy Pattern est utilisé lorsque tu veux contrôler ou modifier les appels à un objet tout en déléguant la tâche à l'objet réel, sans affecter son implémentation interne.
  • Le Mixin Pattern permet de modifier dynamiquement les fonctionnalités d'une classe en lui ajoutant des méthodes ou comportements de manière flexible, souvent à travers l'utilisation de traits comme Macroable en Laravel.

Si tu as besoin de contrôle sur les accès ou la performance (ex. mise en cache), le Proxy Pattern est une solution idéale. Si tu souhaites étendre dynamiquement les capacités d'une classe, le Mixin Pattern sera plus approprié.