Drupalはクラスのオートロードをどのように処理しますか?


10

Drupalはモジュールを介してクラスのオートロードをどのように処理しますか?たとえば、Eventsモジュールがあり、Eventというクラスを宣言し、.infoファイルにクラスファイルを含めた場合、これはどのように登録されますか?

問題は、読み込まれたすべてのクラス名を含む配列を動的に取得しようとしていることです。get_declared_classes()は、この方法で宣言されたすべてのクラスの名前を返さないため、なんらかの方法で自動ロードされていると想定しています。別のスタックオーバーフローの質問からの提案に従って、spl_autoload_functions()を使用してそれらすべてを取得しようとしましたが、これも失敗しました。

何か案は?

回答:


13

.infoファイルにリストされているすべてのファイルは、モジュールの再構築時に解析されます(パフォーマンス上の理由から、リスト内の変更/新規ファイルのみです)。

その後、その情報は{registry}and {registry_files}テーブルに格納されます。したがって、すべてのクラスまたは特定の命名パターンに従ってクラスを取得する場合は、それらのテーブルをクエリできます。


7

Drupalはコードレジストリを維持し、それをクラスのオートローダーに使用します。このレジストリにモジュールのクラスを追加するには、それらのファイルを.infoファイルのfiles []エントリに追加する必要があります。

files[] = includes/Foo.inc
files[] = includes/Bar.inc

PHPのクラス自動読み込みにより、親クラスファイルも読み込まれるようになります。

この回答のユーザーpier-buyleの功績です。同じ質問については、こちらの元の回答をご覧ください。

それが役に立てば幸い


5

spl_autoload_functions()に登録されているオートロード関数のリストを返しますspl_autoload_register()。Drupalは2つのオートロード関数を登録します。1つはクラス用(drupal_autoload_class())、もう1つはインターフェース用(drupal_autoload_interface())です。

どちらの関数も_registry_check_code()を使用します。そのコードを使用して、Drupal 7モジュールによって実装されるすべてのクラスをリストする関数を作成できます。


3

.infoファイルのfiles []配列にエントリを追加した場合は、モジュール管理セクションに移動して、[構成を保存]をクリックする必要があります。これはdrupalを取得して.info情報を更新し、新しいエントリが登録されます。


1

モジュールの実行を開始したときに、情報ファイルでインクルードファイルを宣言しても、それらが認識されないことがわかりました。event.incファイルにクラスEventがある場合。ただし、モジュール内のオブジェクトをクレートすると、認識されません。行を追加します

include_once ('CMatArticleHandler.inc');

$ variable = new event();の前 ライン。私はこれに新しいので、これよりももっとあるかもしれませんが、これまでのところうまくいきました。


1
人々がこれを行う必要がないようにするために何をすべきかを説明するのではなく、単にこれを反対投票することは本当に残念です。私も同じ状況です。Drupalのオートローダーは、クラスを取得するためにファイルをロードする必要性を常に認識していません。
15年

新しいクラスを追加するときは、レジストリをクリアする必要があります。drushを介してこれを行う簡単な方法は、次のコマンドを使用することです。drupal.org
project
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.