Les hooks "post_update" qui ont été exécutés sont stockés dans la base de données, dans la key_value
table, la post_update
collection, mais les données sont sérialisées et difficiles à mettre à jour directement.
J'ai utilisé certains détails de la réponse de @ kiamlaluno pour créer un script drush que vous pouvez utiliser pour réinitialiser un seul crochet. Voici une version de base ( une version plus longue est ici ):
#!/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");
}
Et voici un exemple de ce à quoi il ressemble lorsque vous l'exécutez à partir de la ligne de commande:
./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
Voici un exemple que vous pouvez utiliser à partir de la ligne de commande avec drush php-eval:
Lorsque vous réexécutez drush updatedb, vous verrez votre post_update_hook en attente d'exécution.
la source
drush php:eval 'command'
UpdateRegistry::getPendingUpdateFunctions()
contient le code suivant. Voyez ce que dit le commentaire.UpdateRegistry :: $ updateType est défini sur
'post_update'
.$this->keyValue
est défini à partir deUpdateRegistryFactory::create()
avec la valeur de$this->container->get('keyvalue')->get('post_update')
.Le code procédural équivalent pour obtenir cette collection de valeurs-clés est le suivant.
Définissez existing_updates sur un tableau vide, et Drupal pensera qu'aucun des rappels post-mise à jour n'a été appelé.
Supprimez le nom de rappel de la clé existing_updates de cette valeur de clé, et Drupal pensera que le rappel après mise à jour n'a pas encore été invoqué.
la source
Appelez-le de l'intérieur
hook_update_n()
et faites ce que vous faisiez auparavant.la source