Je travaille actuellement sur un module qui nécessite une bibliothèque PHP tierce, qui est essentiellement une seule classe PHP. Normalement, je le placerais dans un sous-répertoire includes / et ajouterais
files[] = includes/Foo.php
à mon fichier .info et laissez le chargeur automatique de classe Drupal 7 faire son travail quand je fais un $foo = new Foo()
.
J'ai cependant la permission de publier ce module au public et je préfère ne pas inclure la bibliothèque avec le module. Je suis bien conscient des complications liées à l'octroi de licences, mais pour cette question, je voudrais l'ignorer.
Il y a une question similaire, comment puis-je inclure une bibliothèque PHP? , mais je ne pense pas vraiment que cela réponde à mon dilema.
Cette réponse à cette question dit essentiellement d'utiliser l' API des bibliothèques , mais chaque module que j'ai trouvé qui utilise cela fait juste un libraries_get_path()
pour obtenir le chemin de base (et inclut le chemin de secours lorsqu'il n'est pas disponible), puis fait un require
ou include
avec certains vérification des erreurs (ou non). Tous font quelque chose comme:
if (!class_exists('Foo')) {
$path = function_exists('libraries_get_path') ?
libraries_get_path('foo') : 'sites/all/libraries/foo';
if (!include($path . '/Foo.php')) {
// handle this error
}
}
Dans ce cas, l'API Libraries ne fait vraiment rien. Je ne vois pas l'avantage d'utiliser cela, par rapport à l'ancienne méthode consistant à demander aux utilisateurs de télécharger une copie et de la placer dans le dossier du module lui-même. Et, il y a toujours le problème que le développeur du module doit encore effectuer manuellement le chargement avec include
/ require
. Par exemple, le module Facebook charge simplement la bibliothèque dans un hook_init
et le module HTML Purifier a une fonction interne pour vérifier et charger chaque fois que la bibliothèque est nécessaire.
Cela peut être une pratique répandue , mais cela ne semble pas être une meilleure pratique.
Mon module doit-il prendre l'initiative et en déclarer un hook_libraries_info
pour que je puisse l'utiliser libraries_load('foo')
? Cela aussi semble étrange.
if (libraries_load($name)) {..}
est d'éviter un WSOD au cas où la bibliothèque ne serait pas présente.