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()?

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

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.


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.


0

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


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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.