では、古いブログの記事、ラリー・ガーフィールドは、「レジストリ・スタイル」フックとhook_nodeapi型フックを指します。
さまざまな種類のフックを分解することに関しては、ドキュメントがないようです。フックの大きなリストがあり、Tim Plunkettがフックを処理する2つのdefgroupを見つけましたが、私たちが持っているフックの種類の正式な内訳はないようです。
そのような内訳はどのように見えますか?
では、古いブログの記事、ラリー・ガーフィールドは、「レジストリ・スタイル」フックとhook_nodeapi型フックを指します。
さまざまな種類のフックを分解することに関しては、ドキュメントがないようです。フックの大きなリストがあり、Tim Plunkettがフックを処理する2つのdefgroupを見つけましたが、私たちが持っているフックの種類の正式な内訳はないようです。
そのような内訳はどのように見えますか?
回答:
私はそれらを3つ、4つのグループに分類しますが、それらの間に技術的/内部的な違いはありません。これらはすべて、命名規則のために呼び出される関数です。
情報フック。何かに関する情報を提供するフックは、典型的な例として、hook_entity_info()、hook_field_info()、hook_hook_info()、およびhook_permission()、hook_menu()、hook_theme()などです。これらの多くには_info
サフィックスが付いていますが、必ずしもそうする必要はありません。これらのフックはいつでも呼び出すことができ、返された情報は多くの場合、キャッシュ(静的キャッシュまたは永続キャッシュ)または特定のテーブル(などhook_menu()
)に保存されます。
反応/アクションフック。私はちょうどその名前を発明したが、これらはのようなものの特定のhappenendと呼ばれているフックですhook_init() 、 、、hook_node_save()
hook_node_view()など。hook_user_save()
フックを変更します。他のモジュールによって提供される何かを変更するために使用できるフックは、ほとんどすべての情報フック(たとえば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ベースの)別のものと置き換えるか、フック以外の名前に変更する計画があります。
これらのグループのいずれにも正しく配置できないフックや、これらのグループが混在しているフックもあると思います。もしそうなら、それは彼らが再設計されるべきであるという兆候かもしれません。誰かが例を知っている場合は、ここに追加できます。
免責事項:これは公式ではありませんが、私の見方です。注意して使用してください。;)
Larryのブログ投稿を読んで、フックが2種類しかない(レジストリスタイルとnodeapiスタイル)と言っているつもりはないと思います。私の知る限り、フックの公式タイプは定義されていません。基本的に、すべてのフックは技術的に類似していますが、何をどのように行うかには違いがあります。
フックは、最初のhttpリクエストから出力を返すまでの間のどこでも呼び出すことができます。ほとんどのフックは、hook_initのように、(通常はhtml)出力に何らかの影響を与えることを目的としています(たとえば、必要に応じて「通常のフック」と呼びます)。
一部のフックは、出力に直接影響を与えることを意図していませんが、データベースに格納されているレジストリを追加または変更します。これは、ラリーがレジストリスタイルのフックと呼んでいるものです。それらは頻繁に呼び出されませんが、何度も繰り返し使用できる永続的な値のリストを作成します。レジストリとしてデータベースに保存すると、パフォーマンスが向上します。これは、特にhook_menuとhook_themeが行うことです。
ブログで言及されている「nodeapiスタイル」は、単一のフック実装に一連のサブルーチンをバンドルするフックを指します。D6では、hook_nodeapiの実装は、ノードの保存、ノードの表示、ノードの削除など、複数のイベントに応答できます。このタイプのフックはD7には存在しません。たとえば、単一のhook_nodeapiは、hook_node_insert、hook_node_view、hook_node_delete、および同様のフックの束に置き換えられました。
それらを分割する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を組み合わせることができるため、違いは詳細レベルにあります。