Haki „post_update”, które zostały uruchomione, są przechowywane w bazie danych, w key_value
tabeli, w post_update
kolekcji, ale dane są serializowane i niewygodne do bezpośredniej aktualizacji.
Użyłem niektórych szczegółów z odpowiedzi @ kiamlaluno, aby utworzyć skrypt drush, którego można użyć do zresetowania pojedynczego haka. Oto podstawowa wersja ( jest tutaj dłuższa wersja ):
#!/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");
}
A oto przykład tego, jak to wygląda po uruchomieniu go z wiersza poleceń:
./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
Oto przykład, którego możesz użyć z wiersza poleceń z drush php-eval:
Po ponownym uruchomieniu drush updatedb zobaczysz swój post_update_hook czekający na uruchomienie.
źródło
drush php:eval 'command'
UpdateRegistry::getPendingUpdateFunctions()
zawiera następujący kod. Zobacz, co mówi komentarz.UpdateRegistry :: $ updateType jest ustawiony na
'post_update'
.$this->keyValue
jest ustawianyUpdateRegistryFactory::create()
za pomocą wartości$this->container->get('keyvalue')->get('post_update')
.Równoważny kod proceduralny umożliwiający pobranie tej kolekcji wartości klucza jest następujący.
Ustaw istniejącą aktualizację na pustą tablicę, a Drupal pomyśli, że nie wywołano żadnego wywołania zwrotnego po aktualizacji.
Usuń nazwę wywołania zwrotnego z istniejącego klucza aktualizacji tej wartości klucza, a Drupal pomyśli, że wywołanie zwrotne po aktualizacji nie zostało jeszcze wywołane.
źródło
Zadzwoń od wewnątrz,
hook_update_n()
a następnie zrób to, co robiłeś wcześniej.źródło