Attualmente sto lavorando su un modulo che richiede una libreria PHP di terze parti, che è essenzialmente una singola classe PHP. Normalmente, lo inserisco in una sottodirectory include / add e aggiungo
files[] = includes/Foo.php
al mio file .info e lascia che il caricatore automatico di classe Drupal 7 faccia la sua cosa quando lo faccio $foo = new Foo()
.
Ho il permesso, tuttavia, di rilasciare questo modulo al pubblico e preferirei non includere la libreria con il modulo. Sono ben consapevole delle complicazioni relative alle licenze, ma per il bene di questa domanda, vorrei ignorarla.
C'è una domanda simile, come posso includere una libreria PHP? , ma non credo che questo risponda al mio dilema.
Questa risposta a questa domanda dice essenzialmente di usare l' API Librerie , ma ogni singolo modulo che ho trovato che usa questo fa semplicemente un libraries_get_path()
per ottenere il basepath (e include il percorso di fallback quando non è disponibile) e quindi fa un require
o include
con alcuni controllo errori (o no). Tutti fanno qualcosa come:
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 questo caso, l'API Librerie non sta realmente facendo nulla. Non vedo il vantaggio di usare questo, rispetto al vecchio metodo di chiedere agli utenti di scaricare una copia e metterlo nella cartella del modulo stesso. E c'è ancora il problema che lo sviluppatore del modulo deve ancora eseguire manualmente il carico con include
/ require
. Ad esempio, il modulo Facebook carica la libreria in hook_init
ae il modulo Purificatore HTML ha una funzione interna per controllare e caricare ogni volta che è necessaria la libreria.
Questa può essere una pratica diffusa , ma non sembra una buona pratica.
Il mio modulo dovrebbe prendere l'iniziativa e dichiarare un hook_libraries_info
così che io possa usare libraries_load('foo')
? Anche questo sembra strano.
if (libraries_load($name)) {..}
è quello di evitare un WSOD nel caso in cui la libreria non sia presente.