web-dev-qa-db-ja.com

エンティティ保存後に呼び出される最後のフック?

エンティティ保存プロセス中に呼び出されるさまざまなフックのうち、最後に呼び出されるのはどれですか?

エンティティの作成後、すべてのフィールドの保存後、キャッシュの更新後などにイベントをトリガーする方法はありますか?したがって、ユーザーが更新フォームを保存すると、リダイレクトページが読み込まれる前にこのアクションが最後に実行されます。

厳密に保存プロセスの一部でない場合は、問題ありません。重要なのは、エンティティが保存されることに関係するすべての後に呼び出されます。フォーム関数をフックして、そこのデータから保存プロセスが完了したことを確実に識別する方法、またはコールバックを定義する方法がある場合、それは私には問題ありません。

(コンテキスト:フィールドキャッシュが作成されて、新しく作成されたノードや他のフィールド化可能なエンティティタイプが空白であるかのように読み込まれ、フィールドデータがないかのように読み込まれるという問題がありますが、これまでのすべての試行はcache_getを使用してとcache_clear_allはキャッシュを見つけられません-プロセスの後半で作成されているので、確実に取得できる最新の可能なフックを探しています)

(関連情報: hook_entity_postsaveは存在しません 、そして何ヶ月も何ヶ月も前に行き詰まったコアな問題の1つです)

さまざまなラッパー関数( node_save()user_save() など)は、saveメソッドの実行後にエンティティキャッシュをリセットします。エンティティコントローラで呼び出されました。

user_save()関数を例にとると、このキャッシュリセットは後に発生します関数はさまざまなエンティティフックを呼び出します(同じことが当てはまります) node_load()

それを念頭に置いて、質問は「最後に呼び出されるフックは何ですかduringentity save)?...と答えはhook_entity_update()/hook_entity_insert()。ただし、これらはキャッシュがリセットされる前に呼び出されます(明らかな理由による)。

entity_save()メソッドは、特定のエンティティタイプの保存ハンドラを呼び出すだけで、独自のフックを呼び出さないため、実際に使用できるオプションは次のとおりです。

  • インターセプトする必要があるさまざまなエンティティの独自のエンティティコントローラをロールし、save()メソッドを変更して、キャッシュがクリアされた後にフックを呼び出すようにします。
  • 同じコードで既存のエンティティコントローラをハック/パッチします。

どちらも特に魅力的なオプションではありませんが、私が見ないより高いレベルで利用可能なソリューションがない限り、私はあなたに多くの選択肢があるとは思いません。

3
Clive

ノードが保存された後にビューを実行したいという同様の問題がありました。ノードはビューに表示されましたが、保存されたばかりのフィールドに古いデータがありました。その後のビューの呼び出しでは、最新のフィールド値が使用されました。

(私にとって)問題を解決しているように見える、hook_node_updateの先頭で次を呼び出しました。

/**
 * Implements hook_node_update().
 */
function mymodule_node_update($node) {
  // Clear internal properties.                                           
  unset($node->is_new);                                                   
  unset($node->original);                                                 
  // Clear the static loading cache.                                      
  entity_get_controller('node')->resetCache(array($node->nid));  

  // Rest of my code e.g. execute a view.
}

このリセットキャッシュコマンドは、すべてのhook_node_updateを呼び出した後、node_save関数によって実行されるコマンドです。

2
John

はい、エンティティが保存された後に呼び出すフックを提供するアドオンモジュールがあります。 フックポストアクション と呼ばれます。これは既に回答されています stackoverflow.com

2
Druvision