"post_update" kait yang telah dijalankan disimpan dalam database, dalam key_value
tabel, post_update
koleksi, 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
Berikut adalah contoh yang dapat Anda gunakan dari baris perintah dengan drush php-eval:
Ketika Anda menjalankan kembali drush updatedb Anda akan melihat post_update_hook Anda menunggu untuk dijalankan.
sumber
drush php:eval 'command'
UpdateRegistry::getPendingUpdateFunctions()
berisi kode berikut. Lihat apa kata komentar itu.UpdateRegistry :: $ updateType diatur ke
'post_update'
.$this->keyValue
diatur dariUpdateRegistryFactory::create()
dengan nilai$this->container->get('keyvalue')->get('post_update')
.Kode prosedural yang setara untuk mendapatkan koleksi nilai kunci itu adalah sebagai berikut.
Tetapkan existing_updates ke array kosong, dan Drupal akan berpikir tidak ada panggilan balik pembaruan posting yang dipanggil.
Hapus nama panggilan balik dari kunci existing_updates dari nilai kunci itu, dan Drupal akan berpikir bahwa posting pembaruan panggilan balik belum dipanggil.
sumber
Sebut saja dari dalam
hook_update_n()
dan kemudian lakukan apa yang Anda lakukan sebelumnya.sumber