Ich arbeite derzeit an einem Modul, das eine PHP-Bibliothek eines Drittanbieters benötigt, die im Wesentlichen eine einzelne PHP-Klasse ist. Normalerweise würde ich es in ein include / -Unterverzeichnis legen und hinzufügen
files[] = includes/Foo.php
in meine .info Datei und lass den Drupal 7 Klasse Autoloader sein Ding machen, wenn ich a $foo = new Foo()
.
Ich habe jedoch die Erlaubnis, dieses Modul der Öffentlichkeit zugänglich zu machen, und möchte die Bibliothek lieber nicht in das Modul aufnehmen. Ich bin mir der Komplikationen in Bezug auf die Lizenzierung durchaus bewusst, möchte sie jedoch wegen dieser Frage ignorieren.
Es gibt eine ähnliche Frage: Wie binde ich eine PHP-Bibliothek ein? , aber ich glaube nicht, dass dies mein Dilema beantwortet.
Diese Antworten auf diese Frage sagen , im Wesentlichen die verwenden Bibliotheken API , aber jedes einzelne Modul , dass ich gefunden habe , dass Verwendungen dies nur funktioniert eine libraries_get_path()
die basepath zu bekommen (und enthält Ausweichpfad , wenn es nicht verfügbar ist) und dann tut einem require
oder include
mit einigen Fehlerprüfung (oder nicht). Alle machen so etwas wie:
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
}
}
In diesem Fall macht die Bibliotheks-API eigentlich nichts. Ich sehe keinen Vorteil darin, diese gegenüber der alten Methode zu verwenden, bei der Benutzer aufgefordert werden, eine Kopie herunterzuladen und sie im Modulordner selbst abzulegen. Und es ist immer noch das Problem , dass die Modulentwickler noch muss manuell mit der Last tun include
/ require
. Das Facebook-Modul lädt beispielsweise nur die Bibliothek in a hook_init
und das HTML-Purifier-Modul verfügt über eine interne Funktion, mit der jedes Mal geprüft und geladen werden kann, wenn die Bibliothek benötigt wird.
Dies mag eine weit verbreitete Praxis sein, aber es scheint keine bewährte Praxis zu sein.
Sollte mein Modul die Initiative ergreifen und ein deklarieren, hook_libraries_info
damit ich es verwenden kann libraries_load('foo')
? Auch das scheint seltsam.
if (libraries_load($name)) {..}
ist, eine WSOD zu vermeiden, falls die Bibliothek nicht vorhanden ist.