Як повторно підключити kuka_post_update_NAME ()


11

Drupal 8 представив,hook_post_update_NAME() що має деякі переваги надhook_update_n оновленням модулів.

Кожен hook_post_update_NAME()повинен виконуватись лише один раз, але іноді я хочу його повторно, наприклад, коли я налагоджую гачок оновлення під час розробки. З hook_update_n, ви можете скинути версію схеми в базі даних .

Як ти повторюєшся hook_post_update_NAME()?

Відповіді:


11

Запущені гачки "post_update" зберігаються в базі даних, в key_valueтаблиці, post_updateколекції, але дані серіалізуються і незручно безпосередньо оновлюватись.

Я використав деякі деталі з відповіді @ kiamlaluno, щоб створити сценарій барабану, який можна використовувати для скидання одного гачка. Ось основна версія ( довша версія тут ):

#!/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

3
Ви думали про те, щоб сприяти тому, щоб повернутись до drush, github.com/drush-ops/drush ?
powpow12

1
Це дуже солодка особливість, але це трохи занадто ніша для основних Drush. Можливо, хтось створить для нього командний файл.
moshe weitzman

3

Ось приклад, який ви можете використовувати з командного рядка з 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);'

Після повторного запуску оновлення drush ви побачите, що ваш post_update_hook чекає запуску.


Це добре спрацювало для мене, лише зазначимо, що в друзі 9 цеdrush php:eval 'command'
powpow12

Дуже корисно, якщо в середовищі лише для читання. Велике спасибі;)
Mirsoft

1

UpdateRegistry::getPendingUpdateFunctions()містить наступний код. Подивіться, що говорить коментар.

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

UpdateRegistry :: $ updateType встановлено на 'post_update'.
$this->keyValueзадається зі UpdateRegistryFactory::create()значенням $this->container->get('keyvalue')->get('post_update').

Еквівалентний процедурний код для отримання цього зібрання ключових значень є наступним.

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

Встановіть наявні_поновлення на порожній масив, і Drupal подумає, що жоден із зворотних викликів оновлення після публікації не був викликаний.

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

Видаліть ім'я зворотного дзвінка з існуючого ключа цього значення ключового значення, і Drupal подумає, що зворотний зв'язок після оновлення ще не викликався.


0

Телефонуйте зсередини, hook_update_n()а потім робіть те, що робили раніше.


1
Це не здається гарною ідеєю, адже вся мета механізму механізму "прив’язати_політика" - це мати повністю функціональний Drupal, доступний після запуску всіх оновлень. Він був введений, оскільки немає гарантій щодо стану Drupal під час оновлень.
Блок Еельке
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.