it-swarm.com.de

So führen Sie hook_post_update_NAME () erneut aus

Drupal 8 eingeführt hook_post_update_NAME() which hat einige Vorteile gegenüber hook_update_n zum Aktualisieren von Modulen.

Jede hook_post_update_NAME() sollte nur einmal ausgeführt werden, aber manchmal möchte ich sie erneut ausführen, beispielsweise wenn ich den Update-Hook während der Entwicklung debugge. Mit hook_update_n Können Sie die Schemaversion in der Datenbank zurücksetzen .

Wie führt man hook_post_update_NAME() erneut aus?

11
bryanbraun

Ausgeführte "post_update" -Hooks werden in der Datenbank im key_value Tabelle, post_update Sammlung, aber die Daten sind serialisiert und umständlich direkt zu aktualisieren.

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
11
bryanbraun

Hier ist ein Beispiel, das Sie über die Befehlszeile mit drush php-eval verwenden können:

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);'

Wenn Sie drush updatedb erneut ausführen, wird Ihr post_update_hook darauf warten, ausgeführt zu werden.

2

UpdateRegistry::getPendingUpdateFunctions() enthält den folgenden Code. Sehen Sie, was der Kommentar sagt.

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

pdateRegistry :: $ updateType ist auf 'post_update' Gesetzt.
$this->keyValue Wird von UpdateRegistryFactory::create() mit dem Wert $this->container->get('keyvalue')->get('post_update') gesetzt.

Der entsprechende Prozedurcode zum Abrufen dieser Schlüsselwertauflistung ist der folgende.

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

Setzen Sie existierende_updates auf ein leeres Array, und Drupal glaubt, dass keiner der Rückrufe nach der Aktualisierung aufgerufen wurde.

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

Entfernen Sie den Rückrufnamen aus dem vorhandenen_updates Schlüssel dieses Schlüsselwerts, und Drupal wird denken, dass der Rückruf nach der Aktualisierung noch nicht erfolgt ist wurde aufgerufen.

1
kiamlaluno

Rufen Sie es in hook_update_n() auf und tun Sie dann, was Sie zuvor getan haben.

0
nvahalik