Les plugins de Drupal 8, kaçaçéksa ?

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 :

  1. regrouper différents hooks au sein d’une même classe. Comme le hook_block_info, le hook_block_view and so on …
  2. 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

Action

hook_action_info

AggregatorFetcher

hook_aggregator_fetch_info

AggregatorParser

hook_aggregator_parse_info

AggregatorProcessor

hook_aggregator_process_info

Archiver

hook_archiver_info

Block

hook_block_info

hook_cron_queue_info

hook_element_info

CKEditorPlugin

Condition

ConfigEntityType

Constraint

ContentEntityType

ContextDefinition

DataType

DisplayVariant

Editor

EntityReferenceSelection

EntityType

hook_entity_info

FieldFormatter

hook_field_formatter_info

FieldType

hook_field_info

hook_field_storage_info

FieldWidget

hook_field_widget_info

conservé

hook_filetransfer_info

Filter

hook_filter_info

conservé

hook_hook_info

FormElement

ImageEffect

hook_image_effect_info

ImageToolkit

ImageToolkitOperation

InPlaceEditor

LanguageNegotiation

hook_language_negotiation_info

conservé

hook_language_types_info

hook_node_info

hook_openid_discovery_method_info

hook_openid_normalization_method_info

Mail

MigrateDestination

MigrateProcessPlugin

MigrateSource

PageDisplayVariant

Plugin

PluginExample

PluginID

QueueWorker

RenderElement

RestResource

SearchPlugin

hook_search_info

hook_system_theme_info

conservé

hook_token_info

hook_trigger_info

conservé

hook_updater_info

module_hook_info

Tip

Translation

ViewsAccess

ViewsArea

ViewsArgument

ViewsArgumentDefault

ViewsArgumentValidator

ViewsCache

ViewsDisplay

ViewsDisplayExtender

ViewsExposedForm

ViewsField

ViewsFilter

ViewsJoin

ViewsPager

,

ViewsQuery

ViewsRelationship

ViewsRow

ViewsSort

ViewsStyle

ViewsWizard

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 »).

 

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *