私は現在、サードパーティのPHPライブラリを必要とするモジュールに取り組んでいます。これは基本的に単一のPHPクラスです。通常、includes /サブディレクトリに配置して追加します
files[] = includes/Foo.php
.infoファイルに追加して、を実行するときにDrupal 7クラスのオートローダーにその処理を実行させ $foo = new Foo()
ます。
ただし、このモジュールを公開する許可はありますが、ライブラリをモジュールに含めることは避けます。ライセンスに関する複雑さについてはよく知っていますが、この質問のために無視したいと思います。
同様の質問があります。PHPライブラリを含めるにはどうすればよいですか?、しかし、これが私のジレンマに答えるとは思わない。
この質問にこの答えは、基本的に使用するように言うライブラリAPIを、私は用途が、これは単にないことを発見したことを、すべて単一のモジュールlibraries_get_path()
はBasePathを取得(そして、それは利用できない場合にフォールバックパスを含みます)し、その後、ない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は実際には何もしていません。ユーザーにコピーをダウンロードしてモジュールフォルダー自体に配置するよう求める古い方法に比べて、これを使用する利点はありません。また、モジュール開発者が/ を使用して手動でロードを行う必要があるという問題がまだあります。たとえば、Facebookモジュールはライブラリをaにロードするだけで、HTML Purifierモジュールには、ライブラリが必要になるたびにチェックアンドロードする内部関数があります。include
require
hook_init
これは広く行われているプラクティスかもしれませんが、ベストプラクティスとは思えません。
私のモジュールがイニシアチブを取り、hook_libraries_info
使用できるように宣言する必要がありますlibraries_load('foo')
か?これも奇妙に思えます。
if (libraries_load($name)) {..}
、ライブラリが存在しない場合にWSODを回避することです。