Tutoriels

Tour d'horizon des façades

Marc COLLET avatar
Publié le 2 octobre 2024
Couverture de l'article Tour d'horizon des façades

Comme vous l'avez sûrement constaté par vous-même, les façades sont un outil incontournable de l'écosystème Laravel.

Conçues pour offrir aux développeurs une manière simplifiée et intuitive d'accéder aux services de l'application, elles sont présentes depuis la création du framework et font partie intégrante de sa conception.

Aujourd'hui, nous allons décortiquer leur fonctionnement, leurs avantages et inconvénients, et pourquoi les considérer pleinement peut être utile pour vous forger une opinion à leur sujet.

Comment ça fonctionne ?

Une façade est une classe permettant d'accéder à un objet depuis le conteneur de services. Le mécanisme qui rend cela possible se trouve dans la classe Illuminate\Support\Facades\Facade. Les façades, qu'elles soient natives ou personnalisées, vont étendre cette classe de base pour pouvoir fonctionner.

Cette classe utilise la méthode magique __callStatic() pour rediriger les appels de votre façade vers un objet résolu à partir du conteneur.

Pour illustrer ce fonctionnement, utilisons l'exemple mis à disposition par Laravel.

1<?php
2 
3namespace App\Http\Controllers;
4 
5use App\Http\Controllers\Controller;
6use Illuminate\Support\Facades\Cache;
7use Illuminate\View\View;
8 
9class UserController extends Controller
10{
11 /**
12 * Show the profile for the given user.
13 */
14 public function showProfile(string $id): View
15 {
16 $user = Cache::get('user:'.$id);
17 
18 return view('profile', ['user' => $user]);
19 }
20}

Dans cet exemple, nous utilisons la façade Cache. Elle agit comme un intermédiaire pour accéder à l'implémentation sous-jacente de l'interface Illuminate\Contracts\Cache\Factory. Tous les appels effectués via la façade seront redirigés vers cette instance issue du conteneur de services.

Intéressons-nous maintenant au fichier Illuminate\Support\Facades\Cache pour voir de quoi il en retourne.

1class Cache extends Facade
2{
3 /**
4 * Get the registered name of the component.
5 */
6 protected static function getFacadeAccessor(): string
7 {
8 return 'cache';
9 }
10}

Nous pourrions nous attendre à trouver une méthode statique get, comme le laissait supposer notre UserController, mais à la place nous avons la méthode getFacadeAccessor. Cette fonction est issue de la classe parent Illuminate\Support\Facades\Facade et son rôle est de retourner le nom du service tel qu'il est défini au sein du conteneur. Grâce à cela, lorsqu'un utilisateur fait référence à une méthode statique sur la façade, Laravel fait le lien avec le service du conteneur et exécute la méthode demandée, dans notre cas get, sur cet objet.

Les avantages

Les façades présentent plusieurs points forts, notamment celui d'offrir une simplicité syntaxique avantageuse, très facile à retenir et à comprendre.

Nul besoin de se souvenir de longs noms de classes potentiellement complexes qu'il vous faudrait injecter ou configurer manuellement, un simple import et voilà votre code opérationnel. À l'heure où l'on écrit pour être lu, cette caractéristique des façades est l'une des plus importantes, car elle contribue à la bonne compréhension de votre code, par vous-même et par les autres.

Pour aller de pair avec cette facilité d'utilisation, les façades sont très simples à tester, car elles embarquent tout un panel de méthodes dynamiques dédiées aux tests, rendant le mocking bien moins ardu pour le développeur.

Pour reprendre notre exemple avec Cache, voici ce que donnerait un cas d'utilisation dans un test :

1use Illuminate\Support\Facades\Cache;
2 
3/**
4 * A basic functional test example.
5 */
6public function test_basic_example(): void
7{
8 Cache::shouldReceive('get')
9 ->with('key')
10 ->andReturn('value');
11 
12 $response = $this->get('/cache');
13 
14 $response->assertSee('value');
15}

Les inconvénients

Cependant, le plus gros point fort des façades, à savoir leur simplicité, est aussi leur plus gros point faible. Il convient donc d'être prudent lors de leur utilisation.

Étant donné que les dépendances ne sont pas injectées, le risque est d'être confronté à une dérive de la classe en la laissant grandir à outrance via de trop nombreux appels de façades, ce qui posera à terme des soucis de responsabilité et de maintenabilité.

Ayez toujours une attention particulière à la taille de votre classe, d'autant plus que les façades ne remontent pas dans le coupling de certains outils d'analyse statique, ce qui fausse l'appréciation que vous pourriez avoir de la maintenabilité de votre application.

C'est quelque chose qui peut être atténué lorsque nous utilisons l'injection de dépendances : à la vue d'un constructeur bien trop chargé, nous avons un retour visuel qui indique que notre classe fait probablement trop de choses et/ou qu'il y a un souci de conception sous-jacent.

Conclusion

Après ce petit tour d'horizon des façades dans Laravel, vous en savez un peu plus sur leur fonctionnement et sur comment les appréhender.

Elles font partie intégrante de l'écosystème du framework. À vous de voir comment vous souhaitez en tirer parti. Il s'agit d'un outil de plus entre les mains du développeur, à utiliser tout de même avec prudence pour éviter des problèmes de maintenabilité.

A lire

Autres articles de la même catégorie