hook_post_update_NAME()を再実行する方法


11

Drupal 8が導入されました。hook_post_update_NAME()これにhook_update_n、モジュールの更新に関して、に比べていくつかの利点があります。

それぞれhook_post_update_NAME()は1回だけ実行する必要がありますが、開発中に更新フックをデバッグしているときなど、再実行したい場合があります。を使用すると、データベースのスキーマバージョンをリセットhook_update_nできます

どのように再実行しhook_post_update_NAME()ますか?

回答:


11

実行された「post_update」フックは、データベース、key_valueテーブル、post_updateコレクションに格納されますが、データはシリアル化されており、直接更新するのは面倒です。

@kiamlalunoの回答の詳細の一部を使用して、単一のフックをリセットするために使用できるDrushスクリプトを作成しました。これは基本的なバージョンです(長いバージョンはこちらです):

#!/usr/bin/env drush

$key_value = \Drupal::keyValue('post_update');
$update_list = $key_value->get('existing_updates');

$choice = drush_choice($update_list, dt('Which post_update hook do you want to reset?'));

if ($choice) {
  $removed_el = $update_list[$choice];
  unset($update_list[$choice]);
  $key_value->set('existing_updates', $update_list);
  drush_print("$removed_el was reset");
} else {
  drush_print("Reset was cancelled");
}

コマンドラインから実行したときの例を次に示します。

./scripts/reset_hook_post_update_NAME.drush

Which post_update hook do you want to reset?
 [0]   :  Cancel
 [1]   :  system_post_update_add_region_to_entity_displays
 [2]   :  system_post_update_hashes_clear_cache
 [3]   :  system_post_update_recalculate_configuration_entity_dependencies
 [4]   :  system_post_update_timestamp_plugins
 [5]   :  my_module_post_update_example_hook

# The script pauses for user input. 
5 

my_module_post_update_example_hook was reset

3
これをdrushに戻すことを考えましたか、github.com / drush- ops / drush
powpow12

1
これはかなり甘い機能ですが、コアDrushには少しニッチです。おそらく誰かがそのためのコマンドファイルを作成します。
moshe weitzman

3

以下は、drush php-evalを使用してコマンドラインから使用できる例です。

drush php-eval -e '$update_hook_name = "<my_hook_post_update_name>";
$key_value = \Drupal::keyValue('post_update');
$existing_updates = $key_value->get('existing_updates');
$index = array_search($update_hook_name,$existing_updates); 
unset($existing_updates[$index]);
$key_value->set('existing_updates', $existing_updates);'

drush updatedbを再実行すると、post_update_hookが実行されるのを待っているのがわかります。


これはちょうどdrush 9で、それがあることを言及するために、私のためによく働いdrush php:eval 'command'
powpow12

読み取り専用環境であれば非常に便利です。感謝;)
Mirsoft

1

UpdateRegistry::getPendingUpdateFunctions()次のコードが含まれています。コメントの内容をご覧ください。

  // First figure out which hook_{$this->updateType}_NAME got executed
  // already.
  $existing_update_functions = $this->keyValue->get('existing_updates', []);

UpdateRegistry :: $ updateTypeはに設定され'post_update'ます。はの値で
$this->keyValue設定されUpdateRegistryFactory::create()ます$this->container->get('keyvalue')->get('post_update')

そのキー値コレクションを取得するための同等の手続き型コードは次のコードです。

$key_value = \Drupal::keyValue('post_update');

existing_updatesを空の配列に設定すると、Drupalは更新後のコールバックが呼び出されていないと見なします。

$key_value = \Drupal::keyValue('post_update');
$key_value->set('existing_updates', []);

そのキー値のexisting_updatesキーからコールバック名を削除すると、Drupalは更新後のコールバックがまだ呼び出されていないと見なします。


0

内側から呼び出して、hook_update_n()以前と同じように操作します。


1
hook_post_updateメカニズムの全体的な目的は、すべての更新が実行された後に完全に機能するDrupalを使用可能することであるため、これは良い考えのようには思えません。更新中のDrupalの状態に関する保証がないために導入されました。
Eelke Blok、2018
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.