web-dev-qa-db-ja.com

サードパーティのモジュールがモジュールによって実行されるクエリを変更できるようにする

私はパブリックAPIを公開するモジュールを開発しています。このモジュールには、自分のモジュールを使用するすべてのモジュールから使用されることになっている、自分のデータベーステーブルにデータを保存する関数が含まれています。

このモジュールは、データベースのコンテンツをチェックして、ユーザーがサイトへのアクセスを許可されていないかどうか、またはユーザーがユーザープロファイルで何かを変更したときにエラーメッセージを通知する必要があるかどうかを確認します。
ほとんどの場合、データベーステーブルがチェックする唯一のテーブルであることを考慮して、サードパーティモジュールがhook_query_TAG_alter()を介してモジュールから実行されているクエリを変更できるようにコードを変更する必要がありますか? (またはより一般的なhook_query_alter())、または他のモジュールが実装する必要があるカスタムフックを使用しますか?

1
kiamlaluno

あなたの質問が今正確に何であるかは本当にわかりません。

  • なぜhook_query_alter()が存在するのかわかりませんが、最初は存在しませんでした。フックはあまり意味がないと思います。すべてのクエリを変更したいユースケースは考えられません。

  • 他のモジュールがクエリを拡張することを期待している場合は、「-> addTag( 'yourmodule_tag')」を使用して、クエリを変更できるようにします。すでに述べたように、これは同じ既存のクエリを変更する必要がある場合のみを対象としています。他のチェックを行ってから、クエリで真になることのない条件(1 = 0など)を追加することは可能かもしれませんが、それは私にはハッキーに聞こえます。

  • 他のモジュールが実行したいより複雑なチェックがある可能性があると思われる場合は、独自のフックを定義することもできます。おそらく、hook_node_accessパターンを3つの可能な戻り値(ignore、allow、deny)で再利用したいと思うでしょう。 node_access() を参照してください。

これら2つのことのいずれかまたは両方を実行できます。フックの実装はキャッシュされ、フックが呼び出されるたびに再チェックする必要がないため、D7ではフックの呼び出しがかなり高速です。

1
Berdir