Зараз я працюю над модулем, який вимагає сторонньої бібліотеки PHP, яка по суті є єдиним класом PHP. Як правило, я розміщую його у підкаталозі include / add та add
files[] = includes/Foo.php
до мого файлу .info, і дозвольте автонавантажувачу класу Drupal 7 робити все, що я роблю $foo = new Foo()
.
Я маю дозвіл, однак, випускати цей модуль для загального користування, і я краще не включати бібліотеку до модуля. Я добре знаю про ускладнення щодо ліцензування, але заради цього питання я хотів би його проігнорувати.
Існує аналогічне запитання: Як включити бібліотеку PHP? , але я не думаю, що це відповідає на мою дилему.
Цей відповідь на це питання по суті говорить про використання API бібліотек , але кожен знайдений libraries_get_path()
нами модуль, який використовує це, просто робить, щоб отримати базовий шлях (і включає резервний шлях, коли він недоступний), а потім робить require
або include
з деякими перевірка помилок (чи ні). Усі роблять щось на кшталт:
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
}
}
У цьому випадку API бібліотек насправді нічого не робить. Я не бачу переваги у використанні цього, ніж у старому способі просити користувачів завантажити копію та помістити її в саму папку модулів. І все-таки існує проблема, що розробнику модулів ще потрібно вручну виконати навантаження за допомогою include
/ require
. Наприклад, модуль Facebook просто завантажує бібліотеку в a, hook_init
а модуль очищувача HTML має внутрішню функцію для перевірки та завантаження кожного разу, коли бібліотека потрібна.
Це може бути поширеною практикою, але це не здається найкращою практикою.
Чи повинен мій модуль брати на себе ініціативу та заявити таке, hook_libraries_info
щоб я міг його використовувати libraries_load('foo')
? Це теж здається дивним.
if (libraries_load($name)) {..}
є уникнути WSOD у випадку, якщо бібліотека відсутня.