Atualmente, estou trabalhando em um módulo que requer uma biblioteca PHP de terceiros, que é essencialmente uma única classe PHP. Normalmente, eu o colocaria em um subdiretório include / e adicionaria
files[] = includes/Foo.php
no meu arquivo .info e deixe o carregador automático da classe Drupal 7 fazer o seu trabalho quando eu fizer um $foo = new Foo()
.
Porém, tenho permissão para liberar este módulo ao público e preferiria não incluir a biblioteca no módulo. Estou ciente das complicações relacionadas ao licenciamento, mas, para o bem desta pergunta, eu gostaria de ignorá-la.
Há uma pergunta semelhante: como faço para incluir uma biblioteca PHP? , mas acho que isso não responde ao meu dilema.
As respostas a esta pergunta dizem essencialmente para usar a API de bibliotecas , mas cada módulo que eu descobri que usa isso apenas faz um libraries_get_path()
para obter o caminho base (e inclui o caminho de fallback quando não está disponível) e, em seguida, faz um require
ou include
com alguns verificação de erro (ou não). Todos fazem 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
}
}
Nesse caso, a API de bibliotecas não está realmente fazendo nada. Não vejo a vantagem de usar isso, sobre o antigo método de solicitar aos usuários que baixem uma cópia e a coloquem na própria pasta do módulo. E ainda há o problema de que o desenvolvedor do módulo ainda precisa fazer o carregamento manualmente com include
/ require
. Por exemplo, o módulo do Facebook apenas carrega a biblioteca em um hook_init
e o módulo Purificador de HTML tem uma função interna para verificar e carregar toda vez que a biblioteca é necessária.
Esta pode ser uma generalizada prática, mas não parece ser a melhor prática.
Meu módulo deve tomar a iniciativa e declarar um hook_libraries_info
para que eu possa usar libraries_load('foo')
? Isso também parece estranho.
if (libraries_load($name)) {..}
é evitar um WSOD, caso a biblioteca não esteja presente.