Come rieseguire hook_post_update_NAME ()


11

Introduzione dihook_post_update_NAME() Drupal 8 che presenta alcuni vantaggi rispettohook_update_n all'aggiornamento dei moduli.

Ognuno hook_post_update_NAME()dovrebbe essere eseguito solo una volta, ma a volte voglio eseguirlo nuovamente, come quando eseguo il debug dell'hook di aggiornamento durante lo sviluppo. Con hook_update_n, è possibile ripristinare la versione dello schema nel database .

Come riesegui hook_post_update_NAME()?

Risposte:


11

Gli hook "post_update" che sono stati eseguiti sono memorizzati nel database, nella key_valuetabella, nella post_updateraccolta, ma i dati sono serializzati e scomodi da aggiornare direttamente.

Ho usato alcuni dei dettagli della risposta di @ kiamlaluno per creare uno script drush che puoi usare per resettare un singolo hook. Ecco una versione di base (la versione più lunga è qui ):

#!/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");
}

Ed ecco un esempio di come appare quando lo esegui dalla riga di comando:

./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
hai pensato di contribuire con questo a drush, github.com/drush-ops/drush ?
powpow12,

1
Questa è una caratteristica piuttosto dolce, ma è un po 'troppo di nicchia per il core Drush. Forse qualcuno crea un file di comando per questo.
moshe weitzman,

3

Ecco un esempio che puoi usare dalla riga di comando con 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);'

Quando riesegui drush aggiornatob vedrai il tuo post_update_hook in attesa di essere eseguito.


Questo ha funzionato bene per me, solo per citare che in Drush 9 lo èdrush php:eval 'command'
powpow12

Molto utile, se in ambiente di sola lettura.
Mille

1

UpdateRegistry::getPendingUpdateFunctions()contiene il seguente codice. Guarda cosa dice il commento.

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

UpdateRegistry :: $ updateType è impostato su 'post_update'.
$this->keyValueè impostato UpdateRegistryFactory::create()con il valore di $this->container->get('keyvalue')->get('post_update').

Il codice procedurale equivalente per ottenere quella raccolta di valori chiave è il seguente.

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

Impostare existing_updates a un array vuoto, e Drupal penseranno nessuno dei callback di aggiornamento POST sono stati chiamati.

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

Rimuovere il nome di richiamata dalla existing_updates chiave di quel keyvalue, e Drupal penserà che l'aggiornamento postale di richiamata non è ancora stata invocata.


0

Chiamalo dall'interno hook_update_n()e poi fai quello che stavi facendo prima.


1
Non sembra una buona idea, poiché l'intero scopo del meccanismo hook_post_update è di avere un Drupal completamente funzionale disponibile dopo l' esecuzione di tutti gli aggiornamenti. È stato introdotto perché non ci sono garanzie sullo stato di Drupal durante gli aggiornamenti.
Eelke Blok,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.