サードパーティのPHPライブラリからクラスを自動ロードする方法


7

モジュールでサードパーティのPHPライブラリを使用したいのですが、クラスをオートロードするために何をする必要があるのでしょうか?

例:Drupal \ my_module \ MyClassは、ThirdPartyNamespace \ Something \ Else \ Class1をインスタンス化しようとしています

Drupal 8公式ドキュメントでは、より複雑な名前空間のシナリオを実際に扱っていません。



そのもう1つの質問は1年前のものであり、Drupal 8では1年で多くのことが変わる可能性があるため、どこに答えればよいかわからない。Composerマネージャーは1つの方法です。github.com/amateescu/search_api_solrのような独自のオートローダーを同梱することで、ハードコードされた依存関係を回避することもできます。または、フルコンポーザーに移動して、Drupalとモジュールをコンポーザーでビルドすることもできます。現在、良いリソースを見つけることはできませんが、人々はそれを実現するために取り組んでいます。利点は、composer.jsonファイルを自動的に取得してすべてを組み合わせるということです。
Berdir

@Berdirまたは@Cliveは、8.1でこれがどこにあるか教えてくれますか。それは私のカスタムモジュールでそれをサポートするはずあるとここに述べていますが、私はこれを動作させる方法を見つけることができません。requireステートメントをモジュールフォルダーのcomposer.jsonファイルに入れましたcomposer installが、Drupalはまだ彼が私のlibを見つけられないと言っています。
ギヨームボワ

依存関係を認識できるように、composerでモジュールをインストールする必要もあります。drupal.org/node/2404989を参照してください。カスタムモジュールの場合は、メインのcomposer.jsonに自分で追加する必要があります。
Berdir

@berdir私が間違っていない場合、composerはdrupalにモジュールをインストールせず、単にlibsをダウンロードします。モジュールのcomposer.jsonとルートからのライブラリに必要なライブラリを追加する必要がある理由がわかりません。ルートcomposer.jsonに配置する必要がある場合は、Drupalのgitを変更し、そのファイルのためだけにDrupalのgitの別のブランチを管理する必要があります。Drupalは、ルートからのものだけでなく、すべてのcomposer.jsonからのすべてのライブラリを含めることができるはずです。
ギヨームボワ

回答:


4

Drupalはcomposerを使用してサードパーティのライブラリ(Symfony、guzzleなど)を管理します。問題は、Drupalがコアディレクトリーにベンダーフォルダーをバージョン化したことです。ルートコンポーザに新しいライブラリを追加した場合、ベンダーディレクトリを変更してcomposer.json / composer.lockを変更するため、これは問題です。したがって、Drupalが新しいバージョンをリリースすると、変更は削除されます。

作曲マネージャモジュールは、問題を解決するために作成されます。モジュールにcomposer.jsonファイルを含める必要があります。Composer Managerモジュールはライブラリをダウンロードし、新しいオートロードファイル(2番目のオートロード)を登録します。
Composer Managerモジュールがリクエストカーネルイベントに新しいオートロードを登録するため、この問題はミドルウェアライブラリを使用する必要がある場合にのみ発生します。このイベントはミドルウェアの後に呼び出されるため、このライブラリはミドルウェアレイヤーでは使用できません。

ほとんどの場合、Composer Managerモジュールは、新しいベンダーを追加するための最適なソリューションです。

コアリポジトリから外部依存関係を削除し、代わりにComposerに依存関係を管理させる問題があります。


drupal 8.1以降、コンポーザーマネージャーは不要になったことに注意してください。推奨される方法は、drupalルートでdrupalとともに出荷されるcomposer.jsonを変更することです。github.com/drupal-composer/drupal-scaffoldをチェックアウトします
pwaterz 2016

モジュールディレクトリ内で作成を開始することはお勧めしません。ルートコンポーザーファイルを変更して、依存関係を含めることをお勧めします。また、最近ではルートコンポーザーファイルにDrupalモジュールを要求することも可能で、これらのモジュールのすべての依存関係もインストールされます。
Neograph734 2017年

2

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);

1
campaignmonitor/createsend-phpPSR-0またはPSR-4標準に準拠していないため、これらの標準が採用される前に作成され、オートローダーを使用できないため、これを行う必要があるだけだと思います。この回答はこのライブラリにかなり固有のものですが、なぜ(名前空間のため) ``を追加する必要があるのか​​、なぜこの古いライブラリに必要なのかについて、回答で詳しく説明する必要があります。
mradcliffe

0

現在の回答はすべて古くなっているようです。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が処理します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.