В настоящее время я работаю над модулем, который требует сторонней библиотеки PHP, которая по сути является одним классом PHP. Обычно я помещаю его в подкаталог include / и добавляю
files[] = includes/Foo.php
в мой файл .info, и пусть автозагрузчик класса Drupal 7 сделает свое дело, когда я сделаю a $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 Purifier имеет внутреннюю функцию для проверки и загрузки каждый раз, когда библиотека нужна.
Это может быть широко распространенной практикой, но это не похоже на лучшую практику.
Должен ли мой модуль проявить инициативу и объявить, hook_libraries_info
чтобы я мог его использовать libraries_load('foo')
? Это тоже кажется странным.
if (libraries_load($name)) {..}
состоит в том, чтобы избежать WSOD в случае отсутствия библиотеки.