Actualmente estoy trabajando en un módulo que requiere una biblioteca PHP de terceros, que es esencialmente una sola clase PHP. Normalmente, lo colocaría en un subdirectorio incluye / y agregaría
files[] = includes/Foo.php
a mi archivo .info y dejar que el automóvil de clase Drupal 7 Loader haga su trabajo cuando hago una $foo = new Foo()
.
Sin embargo, tengo permiso para lanzar este módulo al público y preferiría no incluir la biblioteca con el módulo. Soy muy consciente de las complicaciones relacionadas con la licencia, pero por el bien de esta pregunta, me gustaría ignorarla.
Hay una pregunta similar, ¿Cómo incluyo una biblioteca PHP? , pero realmente no creo que esto responda a mi dilema.
Estas respuestas a esta pregunta esencialmente dicen que use la API de bibliotecas , pero cada módulo que he encontrado que usa esto solo hace libraries_get_path()
para obtener la ruta base (e incluye la ruta de respaldo cuando no está disponible) y luego hace un require
o include
con algunos comprobación de errores (o no) Todos hacen algo como:
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
}
}
En este caso, la API de Bibliotecas realmente no está haciendo nada. No veo la ventaja de usar esto, sobre el antiguo método de pedir a los usuarios que descarguen una copia y la coloquen en la carpeta del módulo. Y, todavía existe el problema de que el desarrollador del módulo aún necesita hacer la carga manualmente con include
/ require
. Por ejemplo, el módulo de Facebook simplemente carga la biblioteca en hook_init
ay el módulo Purificador de HTML tiene una función interna para verificar y cargar cada vez que se necesita la biblioteca.
Esta puede ser una práctica generalizada , pero no parece una mejor práctica.
¿Debería mi módulo tomar la iniciativa y declarar un hook_libraries_info
para que pueda usar libraries_load('foo')
? Esto también parece extraño.
if (libraries_load($name)) {..}
es evitar un WSOD en caso de que la biblioteca no esté presente.