Contribution : Module Lazy service, un peu plus de paresse dans votre Drupal

Comme il a été évoqué dans le billet de retour de la SymfonyCon, à chaque fois que j'ajoute une injection de dépendance pour un service qui ne sera utilisé qu'une fois au sein de mon service, de mon controller ou autre, ça me défrise.

Pourquoi ne peut-on pas simplement dire que l'on a besoin de ce service, mais qu'il ne soit chargé qu'à la demande ?

Puis j'assiste à la conférence Unleashing the power of lazy objects in PHP de Nicolas Grekas qui présente son travail fait sur le lazy loading des services. Ce qui défile dans ma tête à ce moment :

- Comment l'intégrer à Drupal ?

- Quand sera t'il intégré a Drupal ?

- Mince, ce qu'il présente n'est pas encore complètement publié... je ne suis pas prêt de le voir dans Drupal :(

Ça reste dans ma tête, ça tourne et re-tourne...

Et si ?

Je n'en peux plus, le concept n'est pas si compliqué après tout... J'ouvre le capot de mon Drupal...

Bon point

Bon point, on n'est pas en retard, Drupal dispose déjà de la possibilité de déclarer un service comme étant paresseux (lazy). Il faut simplement rajouter à la déclaration du service l'option "lazy: true" et générer son ProxyClass. On n'est pas à 100% aligné sur le fonctionnement simplifié de Symfony et de ses annotations, mais c'est pas si mal.

Il faut quand même lancer un script manuellement pour générer la classe ProxyClass dans le répertoire du module où se situe le service en question.

Mais pas en avance

On est donc au même état que Symfony actuellement. On sait déclarer un service en tant que "lazy", mais on ne peut pas, depuis un service, dire que l'on veut injecter, en lazy, un service qui n'était pas prévu pour l'être.

On est cuit alors ? Rendez-vous en 2030 ?

Si on devait forcément passer par une mise à jour du coeur de Drupal pour intégrer cette fonctionnalité, certainement !

Je suis mauvaise langue, une telle fonctionnalité pourrait certainement arriver plus tôt, mais dans quelle version de Drupal ? 10 ? 11 ?...

Sauf qu'on a de la chance, Drupal nous donne les leviers nécessaires pour faire ça sous forme de modules contrib. On va donc pouvoir proposer la fonctionnalité tranquillement sous forme de module communautaire, et en parallèle pousser la fonctionnalité dans le coeur.

Oui mais quand ?

Il reste encore du travail, mais le code est déjà disponible. Reste à l'améliorer, écrire les tests, la documentation, ouvrir le ticket pour intégration au coeur de Drupal etc.

En attendant, le module en tant que proof of concept existe, fonctionne sur les quelques tests effectués et va pouvoir faire avancer le sujet.

Ce que l'on doit faire en tant que développeur :

  • On déclare un service comme étant un service à charger en lazy en préfixant son nom lors de l'injection de dépendance par "lazy.". Exemple pour le service "messenger" : "lazy.messenger".

Ce que le module fait alors :

  • Le module vient modifier la liste des services pour générer à la volée si elle n'existe pas la proxyClass correspondante, et finit de déclarer correctement le service.

Je vous invite donc à jeter un oeil et participer, le module Lazy service pour Drupal c'est par là.