Je suis familier avec l'utilisation module_exists
dans un module et je l'utilise dans des situations comme:
- Activez certaines fonctionnalités supplémentaires dans un module, à condition qu'un autre module soit également disponible sur le site. Le module Reservations: Email contient un exemple (en fait, il existe de nombreux exemples de cela), comme le montre la source de son module : pour utiliser des jetons (dans le corps de l'e-mail), il faut que le module Token soit activé.
- Implémentez les dépendances de module dans un thème, comme indiqué dans la réponse à " Comment implémenter les dépendances de module dans un thème et conditionner les modules avec un thème? ".
Cependant, il y en a aussi function_exists
, comme le montre la réponse à " Est-il possible de déclarer une dépendance de bibliothèque Javascript sur Hook.info? ".
J'ai l'impression que l'utilisation function_exists
est une approche plus robuste (sûre) par rapport à module_exists
. Surtout si vous voulez être sûr qu'une fonction (ajoutée dans une nouvelle version d'un module) est disponible, alors qu'en utilisant simplement module_exists
, vous risquez de rencontrer des erreurs comme celles-ci:
- si un site est encore en utilisant une ancienne version d'un module, qui ne dispose pas de cette fonction encore (vous ne devriez pas essayer de l' utiliser encore ).
- si un site est déjà en utilisant une nouvelle version d'un module, qui n'a pas cette fonction plus (vous ne devriez pas essayer de l' utiliser plus ).
Ma question : quels sont les critères typiques, ou les avantages / inconvénients, pour décider d'utiliser l'un module_exists
ou l' autre contre function_exists
?
la source
MODULENAME_requirements
dans le post lié? Oui, cela aurait plus de sens comme un appel àmodule_exists
. Comme MPD l'a mentionné, la manière la plus avancée / la plus abstraite de garantir qu'une dépendance possède certaines fonctionnalités consiste à examiner le code pour une version et à faire en sorte que votre code s'appuie sur une version spécifique avec laquelle vous savez que votre code fonctionne. Tout comme le font Composer / NPM / Bundler / etcVous avez raison,
function_exists
est un moyen plus robuste de vérifier l'existence de la fonction API fournie par le module contrib. Il est très approprié pour utiliser directement l'API du module contrib.J'utilise l' API Session Cache comme exemple:
Cependant, certains modules contrib ne fournissent que des propriétés ou fonctionnalités supplémentaires, il est très difficile de dire quelle fonction dépend. Dans ce cas, vous devez utiliser
module_exists
J'utilise Elements comme exemple:
la source
session_cache_set
est fourni par drupal.org/project/session_cache ou un autre module, et fait donc ce que vous voulez?function_exists
peut empêcher une erreur de fonction non définie lorsque le module contrib a changé son API après la mise à jour. Bien sûr, la méthode la plus garantie est envelopperfunction_exists
avecmodule_exits
comme @Clive mentionné, mais, pour moi, il est trop fastidieux.function_exits
évitez en effet que le site ne tombe complètement en panne ...Les 3 réponses (intéressantes) précédentes m'apparaissent comme confirmant en quelque sorte ma «perception» (comme je l'ai décrit dans ma question). Il est intéressant de noter que ces réponses ont été écrites à l'origine indépendamment les unes des autres (elles ont été publiées à peu près au même moment, comme illustré dans la chronologie de cette question , utilisez le "format bascule" pour voir les "minutes").
La réponse de Jimmy Ko (+ commentaires en dessous), illustre quelques autres exemples de la façon dont l'utilisation
function_exists
peut rendre un module plus robuste par rapport aux changements possibles dans un autre module qu'un module utilise (dépend).La réponse de Clive montre que vous pouvez aussi bien combiner
module_exists
etfunction_exists
, alors que le commentaire ci-dessous résout mes doutes sur monfunction_exists
exemple (c'est-à-dire qu'il devrait plutôt utilisermodule_exists
).La réponse de mpdonadio (+ commentaires en dessous) est, du moins pour moi, la plus difficile à digérer. Mais après avoir examiné le commentaire de Shawn Conn ci-dessous, j'ai trouvé quelques liens supplémentaires qui fournissent plus de détails sur tout cela, à savoir:
"Ma conclusion" (après avoir digéré les réponses précédentes): Laissez le Drupal core utiliser
function_exists
, et les modules contribués / personnalisés devraient essayer, autant que possible, de respectermodule_exists
... bien qu'il y ait des exceptions ...la source