新しい Drupal フック属性

Linda Hamilton
リリース: 2024-12-30 01:01:10
オリジナル
176 人が閲覧しました

New Drupal Hook attribute

新バージョンの発表で、気になるものがありました。タイトルから、それがフック属性であることがわかります。
php 属性に詳しくない人のために、少し前にそれについての記事を書きました。

Drupal 8 がコードの構造化にオブジェクト指向の方法に移行して以来、フックを追加する必要がある方法は私にとって目障りでした。
モジュール名を使用して関数の接頭辞を付けたり、.module ファイルを使用してすべての関数を追加したりするのは、私にとって非常にスパゲッティ コードのように感じられました。

そして今、彼らはそれをほぼ修正しました。それは、まだ手続き的なフックがたくさんあるからです。 Drupal 12 では手続き型フックを削除する計画なので、次の Drupal マイナー バージョンではこれらのフックが消える予定です。

メリットは何ですか?

.module ファイルに関数を追加する代わりに、フックはモジュールの src ディレクトリにあります。
識別しやすくするために、Hooks サブディレクトリを使用することをお勧めします。または、クラス名に Hooks サフィックスを追加します。

これは属性であるため、複数のフックを同じメソッドにバインドできます。

// module.module

function module_comment_insert(CommentInterface $comment) {
   module_comment_manipulation($comment);
}

function module_comment_update(CommentInterface $comment) {
   module_comment_manipulation($comment);
}

function module_comment_manipulation(CommentInterface $comment) {
  // do something
}

// with Hook attribute 
class CommentHooks {

  #[Hook('comment_insert')]
  #[Hook('comment_update')]
  public function commentInsertOrUpdate(CommentInterface $comment) {
    // do something
  }
}
ログイン後にコピー
ログイン後にコピー

11.1 より前の Drupal バージョンのモジュールを保守する人のために、追加の属性 LegacyHook があります。これにより、フックのコードをフック属性を持つクラスに移動することができます。また、Drupal の古いバージョンでは .module ファイル内の関数が実行されますが、新しいバージョンではクラス メソッドのみが実行されます。

// module.module
#[LegacyHook]
function module_comment_insert(CommentInterface $comment) {
   new CommentHooks()->commentInsertOrUpdate($comment);
}

#[LegacyHook]
function module_comment_update(CommentInterface $comment) {
   new CommentHooks()->commentInsertOrUpdate($comment);
}
ログイン後にコピー

フック属性の使い方

前のコード例からわかるように、属性がメソッドに追加されます。

ただし、メソッドをクラスに追加することもできます。

#[Hook('comment_insert')]
#[Hook('comment_update')]
class CommentManipulationHook {
  public function __invoke(CommentInterface $comment) {
    // do something
  }
}
ログイン後にコピー

例で示したように、クラス名をよりわかりやすいものにすることをお勧めします。また、Hooks の代わりに接尾辞 Hook を使用します。

フック属性をクラスに追加し、メソッドを 2 番目のパラメーターとして追加できます。これはお勧めしません。その場合は、メソッドに属性を追加する方がきれいです。

3 番目のフックパラメータである module があります。これにより、別のモジュールからフック クラスを実行できるようになります。たとえば、#hook('comment_insert', 'commentInsert', 'my_comment_module') のようになります。
これの使用例を考えていましたが、見つかりませんでした。
ご存知の方がいらっしゃいましたら、お知らせください。

結論

私は Drupal コードが正しい方向に進んでいるのを見るのが大好きです。

私が気になったのは、フックが魔法の定数であるということです。ただし、計画では、すべてのフック属性を基本クラスとして Hook 属性にする予定です。したがって、 #[Hook('comment_insert')] の代わりに #[CommentInsert] になります。
これを行うもう 1 つの方法は、モジュールごとにグループ化された列挙型を使用することです。

// module.module

function module_comment_insert(CommentInterface $comment) {
   module_comment_manipulation($comment);
}

function module_comment_update(CommentInterface $comment) {
   module_comment_manipulation($comment);
}

function module_comment_manipulation(CommentInterface $comment) {
  // do something
}

// with Hook attribute 
class CommentHooks {

  #[Hook('comment_insert')]
  #[Hook('comment_update')]
  public function commentInsertOrUpdate(CommentInterface $comment) {
    // do something
  }
}
ログイン後にコピー
ログイン後にコピー

この投稿の情報は、ドキュメントと実装の概要に基づいています。機能をテストすると、投稿する更新または追加の投稿が行われます。

以上が新しい Drupal フック属性の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:dev.to
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート