web-dev-qa-db-ja.com

クラスを使用してモジュールを構築するためのベストプラクティス

Lazy/auto-loadがDrupal 7にあり、私が実行しているいくつかのモジュール(contribまたはcore)を確認したいので、クラスとしてモジュールの構築を開始しようと思っていますそれの素晴らしい仕事。

クラスをフックとして統合するための独創的な方法はありますか?各機能をctoolsプラグインとして実装しますか?

通行人は、D7に新しいfiles[]モジュールの宣言.info自動/遅延ロードクラス/インターフェースのファイル: 。infoファイルの書き込み(Drupal 7.x)

以下は、Drupalコミュニティ オブジェクト指向の観点からのDrupalプログラミング )からモチベーションと憲法(現状のまま)を取得するための良い参考文献です。

19
electblake

モジュールはクラスではありません Crellが最初に読むべきものです。

最大のOOPの一部Drupal 7は、新しいデータベースアブストラクションレイヤーです(まったく同じCrellなどによって設計されています)。これは、多くのパターンを実装し、再利用されます。

例えば:

まだ論争の的に議論されている であるものは 情報の非表示 です。 DBTNGは、クラスプロパティを保護し、直接アクセスを禁止することにより、それを実装します。一方で、hook_query_alter()があり、さまざまな 参照ゲッターによる メソッドを使用してほぼ自由に変更できます。

16
Berdir

これは興味深い質問です。

Drupalモジュールをクラスとして使用するという考えは非常に興味深いものです。ただし、D7モジュールでも名前でチェックされるフック関数を実装するだけなので、モジュールのクラスを作成しても、それらを呼び出すためにフック関数を実装する必要があります。

ただし、多くのモジュールは内部でクラスを使用し、これらのクラスを介して機能を公開しています。最も明白な例はビューです。だからそれは見るのに良い場所かもしれません。ただし、多くのモジュールは独自の方法でクラスを使用しているため、ビューを見ることから学んだことが常に適用できるとは限らないことに注意してください。

3
Jeremy French

エンティティAPI(contribモジュール)を使用すると、エンティティタイプごとに「エンティティクラス」を宣言できるため、エンティティに関連するすべてのコード(作成、ロード、保存、アクセスなど)をクラスに含めることができます(Organicを参照)たとえば、グループがそれを行います)。

とはいえ、無理しないでください。 ctoolsプラグインは、必要なときに(次のビュー、パネル、またはルールを作成するときに)良いものですが、イデオロギーの純粋さのためだけにクラスをどこでも使用しても、あまり効果がありません。

2
Bojan Zivanovic