Cara menjalankan kembali hook_post_update_NAME ()

11

Drupal 8 diperkenalkanhook_post_update_NAME() yang memiliki beberapa kelebihanhook_update_n , untuk memperbarui modul.

Masing hook_post_update_NAME()- masing hanya boleh berjalan satu kali, tetapi kadang-kadang saya ingin memutarnya kembali, seperti ketika saya men-debug kait pembaruan selama pengembangan. Dengan hook_update_n, Anda dapat mengatur ulang versi skema di database .

Bagaimana Anda menjalankan kembali hook_post_update_NAME()?

bryanbraun
sumber

Jawaban:

11

"post_update" kait yang telah dijalankan disimpan dalam database, dalam key_valuetabel, post_updatekoleksi, tetapi data bersambung dan canggung untuk memperbarui secara langsung.

Saya menggunakan beberapa detail dari jawaban @ kiamlaluno untuk membuat skrip drush yang dapat Anda gunakan untuk mereset sebuah kail tunggal. Ini versi dasar ( versi yang lebih lama ada di sini ):

#!/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");
}

Dan inilah contoh tampilannya saat Anda menjalankannya dari baris perintah:

./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
bryanbraun
sumber
3
Pernahkah Anda berpikir untuk menyumbangkan ini kembali ke drush, github.com/drush-ops/drush ?
powpow12
1
Ini adalah fitur yang cukup manis, tetapi agak terlalu ceruk untuk Drush inti. Mungkin seseorang membuat file perintah untuk itu.
Moshe Weitzman
3

Berikut adalah contoh yang dapat Anda gunakan dari baris perintah dengan 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);'

Ketika Anda menjalankan kembali drush updatedb Anda akan melihat post_update_hook Anda menunggu untuk dijalankan.

Jason Yarrington
sumber
Ini bekerja dengan baik untuk saya, hanya untuk menyebutkan bahwa pada drush 9, itudrush php:eval 'command'
powpow12
Sangat berguna, jika pada lingkungan read-only. Terima kasih banyak;)
Mirsoft
1

UpdateRegistry::getPendingUpdateFunctions()berisi kode berikut. Lihat apa kata komentar itu.

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

UpdateRegistry :: $ updateType diatur ke 'post_update'.
$this->keyValuediatur dari UpdateRegistryFactory::create()dengan nilai $this->container->get('keyvalue')->get('post_update').

Kode prosedural yang setara untuk mendapatkan koleksi nilai kunci itu adalah sebagai berikut.

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

Tetapkan existing_updates ke array kosong, dan Drupal akan berpikir tidak ada panggilan balik pembaruan posting yang dipanggil.

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

Hapus nama panggilan balik dari kunci existing_updates dari nilai kunci itu, dan Drupal akan berpikir bahwa posting pembaruan panggilan balik belum dipanggil.

kiamlaluno
sumber
0

Sebut saja dari dalam hook_update_n()dan kemudian lakukan apa yang Anda lakukan sebelumnya.

nvahalik
sumber
1
Itu sepertinya bukan ide yang baik, karena seluruh tujuan mekanisme hook_post_update adalah untuk memiliki Drupal yang berfungsi penuh tersedia setelah semua pembaruan berjalan. Itu diperkenalkan karena tidak ada jaminan tentang keadaan Drupal selama pembaruan.
Eelke Blok