フックにはどのような種類がありますか?


7

では、古いブログの記事、ラリー・ガーフィールドは、「レジストリ・スタイル」フックとhook_nodeapi型フックを指します。

さまざまな種類のフックを分解することに関しては、ドキュメントがないようです。フック大きなリストがあり、Tim Plunkettがフックを処理する2つのdefgroupを見つけましたが、私たちが持っているフックの種類の正式な内訳はないようです。

そのような内訳はどのように見えますか?


興味深い質問です。理論的な議論の後ですか、それとも解決しようとしている特定の問題がありますか?
marcvangend

2
いくつか理由があります。1)論文を書くのに役立ちます2)異なるタイプのフックがnewbを混乱させるため、ドキュメントに適しています3)モジュールの設計時およびコア開発時に知っておくと、ベストプラクティスとベストプラクティスが存在しない場所を分離するのに役立ちます場所
linclark '29年

回答:


7

私はそれらを3つ、4つのグループに分類しますが、それらの間に技術的/内部的な違いはありません。これらはすべて、命名規則のために呼び出される関数です。

  1. 情報フック。何かに関する情報を提供するフックは、典型的な例として、hook_entity_info()hook_field_info()hook_hook_info()およびhook_permission()hook_menu()hook_theme()などです。これらの多くには_infoサフィックスが付いていますが、必ずしもそうする必要はありません。これらのフックはいつでも呼び出すことができ、返された情報は多くの場合、キャッシュ(静的キャッシュまたは永続キャッシュ)または特定のテーブル(などhook_menu())に保存されます。

  2. 反応/アクションフック。私はちょうどその名前を発明したが、これらはのようなものの特定のhappenendと呼ばれているフックですhook_init() 、 、、hook_node_save() hook_node_view()など。hook_user_save()

  3. フックを変更します。他のモジュールによって提供される何かを変更するために使用できるフックは、ほとんどすべての情報フック(たとえばhook_menu_alter()またはhook_entity_info_alter())といくつかのアクションフック(たとえばhook_node_view_alter())に存在します。

4番目のグループもありますが、実際にはフックではなく、フックに関する一般的な混乱の主な理由の1つです。それらはしばしば「コールバック」と呼ばれます。これは、何かを所有する単一のモジュールに対してのみ呼び出される「フック」です。典型的な例には、ノードタイプコールバック(hook_submit、hook_view、hook_formなど)、多くのフィールドフック(hook_field_load()など)だけでなく、hook_block_view()含まれます。これらを削除して、(oopベースの)別のものと置き換えるか、フック以外の名前に変更する計画があります。

これらのグループのいずれにも正しく配置できないフックや、これらのグループが混在しているフックもあると思います。もしそうなら、それは彼らが再設計されるべきであるという兆候かもしれません。誰かが例を知っている場合は、ここに追加できます。

免責事項:これは公式ではありませんが、私の見方です。注意して使用してください。;)


0

Larryのブログ投稿を読んで、フックが2種類しかない(レジストリスタイルとnodeapiスタイル)と言っているつもりはないと思います。私の知る限り、フックの公式タイプは定義されていません。基本的に、すべてのフックは技術的に類似していますが、何をどのように行うかには違いがあります。

フックは、最初のhttpリクエストから出力を返すまでの間のどこでも呼び出すことができます。ほとんどのフックは、hook_initのように、(通常はhtml)出力に何らかの影響を与えることを目的としています(たとえば、必要に応じて「通常のフック」と呼びます)。

一部のフックは、出力に直接影響を与えることを意図していませんが、データベースに格納されているレジストリを追加または変更します。これは、ラリーがレジストリスタイルのフックと呼んでいるものです。それらは頻繁に呼び出されませんが、何度も繰り返し使用できる永続的な値のリストを作成します。レジストリとしてデータベースに保存すると、パフォーマンスが向上します。これは、特にhook_menuhook_themeが行うことです。

ブログで言及されている「nodeapiスタイル」は、単一のフック実装に一連のサブルーチンをバンドルするフックを指します。D6では、hook_nodeapiの実装は、ノードの保存、ノードの表示、ノードの削除など、複数のイベントに応答できます。このタイプのフックはD7には存在しません。たとえば、単一のhook_nodeapiは、hook_node_insert、hook_node_view、hook_node_delete、および同様のフックの束に置き換えられました。


フックが2種類しかないことを示唆するつもりはありませんでした。さまざまなフックの機能の分類を探しています。たとえば、モジュール内で定義されたノードタイプでのみ動作するいくつかのコールバックフック(Berdirが上記の4番目のグループで指摘しているように、おそらくフックであってはなりません)があります。
linclark '29年

OK、あなたがそれを提案するつもりかどうかはわかりませんでした。とにかく、私の答えはベルディールの3 + 1カテゴリに沿っていると思います。彼の答えを支持します。
marcvangend、2011年

0

それらを分割する1つの方法は、入力と出力の観点からです。1)入力のみ、2)出力のみ、3)入出力、4)入力なし、出力なし。

発生するほとんどすべてが何らかの応答を持つ可能性があるため、#1は多くありません。考えられる唯一の例は、削除フックです。たとえば、hook_file_delete()、hook_comment_delete()の場合、フックは削除されたオブジェクトを取得しますが、そのオブジェクトはすでに削除されているため、応答する理由はありません。

「レジストリスタイル」のフックは、出力のみ#2になります。中央のレジストリにデータをフィードするだけで、何も入力しません。hook_menu()とhook_help()は例です。

hook_nodeapi()は#3でしたが、今では、hook_node_presave()-(#3-)とhook_node_delete()-(現在は#1)などのさまざまな関数に分割されています。これは最も一般的なグループです。多くの例では、フック名に「alter」という単語が明示的に含まれています(hook_form_alter()など)。

hook_init()のようなものは#4でしょう。イベントの一般的な通知以外に、入力も出力もありません。

ただし、これはかなり恣意的な分析です。#3を、出力が入力と同じ構造(代替)のフックと、出力が完全に異なる構造(呼び出し応答)のフックに分けるフックについては、簡単に議論できます。または、関数呼び出し自体が入力のタイプであるため、#1と#4を組み合わせることができるため、違いは詳細レベルにあります。


hook_menu_alterもレジストリのみですが、「入力を受け取ります」。
tim.plunkett、
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.