モジュールでサードパーティのPHPライブラリを使用したいのですが、クラスをオートロードするために何をする必要があるのでしょうか?
例:Drupal \ my_module \ MyClassは、ThirdPartyNamespace \ Something \ Else \ Class1をインスタンス化しようとしています
モジュールでサードパーティのPHPライブラリを使用したいのですが、クラスをオートロードするために何をする必要があるのでしょうか?
例:Drupal \ my_module \ MyClassは、ThirdPartyNamespace \ Something \ Else \ Class1をインスタンス化しようとしています
回答:
Drupalはcomposerを使用してサードパーティのライブラリ(Symfony、guzzleなど)を管理します。問題は、Drupalがコアディレクトリーにベンダーフォルダーをバージョン化したことです。ルートコンポーザに新しいライブラリを追加した場合、ベンダーディレクトリを変更してcomposer.json / composer.lockを変更するため、これは問題です。したがって、Drupalが新しいバージョンをリリースすると、変更は削除されます。
作曲マネージャモジュールは、問題を解決するために作成されます。モジュールにcomposer.jsonファイルを含める必要があります。Composer Managerモジュールはライブラリをダウンロードし、新しいオートロードファイル(2番目のオートロード)を登録します。
Composer Managerモジュールがリクエストカーネルイベントに新しいオートロードを登録するため、この問題はミドルウェアライブラリを使用する必要がある場合にのみ発生します。このイベントはミドルウェアの後に呼び出されるため、このライブラリはミドルウェアレイヤーでは使用できません。
ほとんどの場合、Composer Managerモジュールは、新しいベンダーを追加するための最適なソリューションです。
Drupalプロジェクトのルートとライブラリに依存するモジュールでcomposer.jsonを編集しました。次に、固定パスを使用してメインクラスをロードしました。
require_once (\Drupal::root() . '/vendor/campaignmonitor/createsend-php/csrest_general.php');
次に、クラスのオブジェクトのインスタンス化に問題があることに気づきました。
$wrap = new CS_REST_General($auth);
したがって、明らかに '\'を追加する必要があります。例:
$wrap = new \CS_REST_General($auth);
campaignmonitor/createsend-phpPSR-0またはPSR-4標準に準拠していないため、これらの標準が採用される前に作成され、オートローダーを使用できないため、これを行う必要があるだけだと思います。この回答はこのライブラリにかなり固有のものですが、なぜ(名前空間のため) ``を追加する必要があるのか、なぜこの古いライブラリに必要なのかについて、回答で詳しく説明する必要があります。
現在の回答はすべて古くなっているようです。Composerを使用してプロジェクトの依存関係を管理する場合は、できればを使用drupal-composer/drupal-projectして、プロジェクトルートのパッケージを要求し、composer.json必要な場所にそのクラスをロードするだけです。
$ cd MYPROJECT
$ composer require ramsey/uuid
次に、カスタムモジュールでそれだけですuse。
use Ramsey\Uuid\Uuid;
カスタムモジュールに独自のモジュールを提供させるには、プロジェクトのルートにcomposer.json追加し、セクションで特定のディレクトリパターンにある他のモジュールを含めるように構成します。wikimedia/composer-merge-plugincomposer.json"extra": {}composer.json
"merge-plugin": {
"include": [
"web/modules/custom/*/composer.json"
]
},
それ以外はすべてDrupalが処理します。