Ausgeführte "post_update" -Hooks werden in der Datenbank, in der key_value
Tabelle und in der post_update
Sammlung gespeichert , aber die Daten sind serialisiert und können nur schwer direkt aktualisiert werden.
Ich habe einige Details aus der Antwort von @ kiamlaluno verwendet, um ein Drush-Skript zu erstellen, mit dem Sie einen einzelnen Hook zurücksetzen können. Hier ist eine Basisversion ( längere Version ist hier ):
#!/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");
}
Und hier ist ein Beispiel dafür, wie es aussieht, wenn Sie es über die Befehlszeile ausführen:
./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
Hier ist ein Beispiel, das Sie über die Befehlszeile mit drush php-eval verwenden können:
Wenn Sie drush updatedb erneut ausführen, wird Ihr post_update_hook darauf warten, ausgeführt zu werden.
quelle
drush php:eval 'command'
UpdateRegistry::getPendingUpdateFunctions()
enthält den folgenden Code. Sehen Sie, was der Kommentar sagt.UpdateRegistry :: $ updateType ist auf gesetzt
'post_update'
.$this->keyValue
wirdUpdateRegistryFactory::create()
mit dem Wert von gesetzt$this->container->get('keyvalue')->get('post_update')
.Der entsprechende Prozedurcode zum Abrufen dieser Schlüsselwertauflistung ist der folgende.
Setzen Sie vorhandene_Updates auf ein leeres Array, und Drupal glaubt, dass keiner der Rückrufe nach der Aktualisierung aufgerufen wurde.
Entfernen Sie den Rückrufnamen aus dem vorhandenen_updates- Schlüssel dieses Schlüsselwerts, und Drupal wird annehmen, dass der Rückruf nach der Aktualisierung noch nicht aufgerufen wurde.
quelle
Rufen Sie es von innen an
hook_update_n()
und tun Sie dann, was Sie zuvor getan haben.quelle