Выполненные перехваты 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
Вот пример, который вы можете использовать из командной строки с помощью drush php-eval:
При повторном запуске drush updatedb вы увидите, что ваш post_update_hook ожидает запуска.
источник
drush php:eval 'command'
UpdateRegistry::getPendingUpdateFunctions()
содержит следующий код Посмотрите, что говорится в комментарии.UpdateRegistry :: $ updateType установлен в
'post_update'
.$this->keyValue
устанавливаетсяUpdateRegistryFactory::create()
со значением$this->container->get('keyvalue')->get('post_update')
.Эквивалентный процедурный код для получения этой коллекции значений ключей следующий.
Задайте для существующих_updates пустой массив, и Drupal будет думать, что ни один из обратных вызовов после обновления не был вызван.
Удалите имя обратного вызова из существующего ключа этого значения ключа, и Drupal будет думать, что обратный вызов после обновления еще не был вызван.
источник
Позвони изнутри
hook_update_n()
и сделай то, что делал раньше.источник