En Drupal 7, tout démarre avec le hooks. Ce temps de simplicité se termine avec Drupal 8, on a maintenant 6 mécanismes d’extension (hooks, plugins, entities, services, routing, events). Les plugins sont les petits nouveaux de l’API drupal 8, ils remplacent certains hooks, mais pas tous. On y est très vite confronté puisque pour créer un block, on passe par un plugin (Drupal\Core\Block\BlockBase
). Mais pas pour créer un menu menu (hook_menu qui n’existe plus en Drupal 8) ni modifier une formulaire (hook_form_alter, qui existe toujours en D8). Pourquoi ?
Pourquoi certains hooks sont remplacés et pas d’autres ? Pourquoi les avoir remplacés ? hook, plugin, services, avec tous ces mécanismes d’extensions, on s’y perds. Qui sert à quoi ? Je me suis très tôt posé des questions la dessus (cf mon commentaire). Avec la sortie de la RC1 et l’amélioration de la documentation, on commence à y voir plus clair.
Plugin vs Service :
Les plugins sont des extensions, des rajouts. Les services ce sont plutôt l’accès aux « internals ».
- le cache est un service parce qu’on s’attend toujours au même comportement, quelque soit l’implémentation (base, mémoire, fichier…)
- le widget est un plugin parce que si ils ont tous une API commune, ils se comportent très différemment les uns les autres
Plugin vs Hook:
Pour faire simple, les plugins remplacent les « hook_info ». L’avantage est double :
- regrouper différents hooks au sein d’une même classe. Comme le hook_block_info, le hook_block_view and so on …
- disposer grâce à l’héritage d’une implémentation par défaut : on ne code que ce dont on a vraiment besoin.
Notez que les hook_alter en revanche sont conservés.
Mais ou est la liste des plugins alors ? On ne l’a pas sur la page l’API plugin qui se borne à expliquer comment créer/utiliser des plugins.
Il y a une astuce : tous les plugins sont des classes annotées. Il faut aller chercher dans la liste des annotations. Autre solution, installer le module Plugin qui vous fait la liste dans Drupal lui même (mais attention, il faut installer avant le composer_manager sinon vous risquez d’avoir des soucis).
Et maintenant comparons à la liste des hook_info de Drupal 7. Je l’ai remis un peu en forme en deux colonnes pour qu’on voie mieux ce qui a été conservé et ce qui a bougé. Il y a pas mal de différences :
Drupal 8 |
Drupal 7 |
conservé |
|
conservé |
|
conservé |
|
conservé |
|
conservé |
|
, |
|
Conclusion :
- la plupart des hooks_infos sont en effet transformés en Plugins, une poignée a du changer de place (ou ne plus être utile) sauf OpenID qui a été retiré du coeur.
- Il y a pas mal de petits nouveaux dans Drupal 8, notamment tous ceux qui concernent Views (normal puisque ce module a été intégré au coeur !)
- Un peu de refactoring coté Entité, ce qui inclus la disparition du hook_node_info (remplacé par l’entity_api. Cf l’exemple du module « example »).