Hook_post_update_NAME () nasıl yeniden çalıştırılır


11

Modülleri güncellemek için bazı faydaları olan Drupal 8 tanıtıldıhook_post_update_NAME() .hook_update_n

Her biri hook_post_update_NAME()sadece bir kez çalışmalıdır, ancak bazen geliştirme sırasında güncelleme kancasında hata ayıkladığımda olduğu gibi tekrar çalıştırmak istiyorum. İle hook_update_n, veritabanındaki şema sürümünü sıfırlayabilirsiniz .

Nasıl tekrar çalıştırıyorsun hook_post_update_NAME()?

Yanıtlar:


11

Çalıştırılan "post_update" kancaları veritabanında, key_valuetabloda, post_updatekoleksiyonda saklanır , ancak veriler serileştirilir ve doğrudan güncellenmesi zor olur.

@ Kiamlaluno'nun cevabındaki bazı ayrıntıları, tek bir kancayı sıfırlamak için kullanabileceğiniz bir komut dosyası oluşturmak için kullandım. İşte temel bir sürüm ( daha uzun sürüm burada ):

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

Ve komut satırından çalıştırdığınızda nasıl göründüğüne bir örnek:

./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


1
Bu oldukça tatlı bir özellik, ama çekirdek Drush için biraz fazla niş. Belki birisi bunun için bir komut dosyası yapar.
moshe weitzman

3

Komut satırından drush php-eval ile kullanabileceğiniz bir örnek:

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 updatedb'yi yeniden çalıştırdığınızda post_update_hook'unuzun çalıştırılmayı beklediğini göreceksiniz.


Bu sadece drush 9'da, öyle olduğunu söylemeyi, benim için iyi çalıştıdrush php:eval 'command'
powpow12

Salt okunur ortamdaysa çok kullanışlıdır. Çok teşekkürler;)
Mirsoft

1

UpdateRegistry::getPendingUpdateFunctions()aşağıdaki kodu içerir. Yorumun ne dediğine bakın.

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

UpdateRegistry :: $ updateType olarak ayarlandı 'post_update'.
$this->keyValueayarlanır UpdateRegistryFactory::create()değeri ile $this->container->get('keyvalue')->get('post_update').

Bu anahtar-değer toplamasını almak için eşdeğer prosedür kodu aşağıdaki gibidir.

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

Set existing_updates boş diziye ve Drupal sonrası güncelleme geri aramaları hiçbiri denilen edilmiş düşünürler.

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

Dan geri arama adını kaldırın existing_updates o KeyValue anahtarında ve Drupal post güncelleme geri henüz müracaat edilmemiştir düşünürler.


0

İçeriden arayın hook_update_n()ve daha önce ne yaptığınızı yapın.


1
Hook_post_update mekanizmasının tüm amacı, tüm güncellemeler çalıştırıldıktan sonra tamamen işlevsel bir Drupal'a sahip olmak olduğundan, bu iyi bir fikir gibi görünmüyor . Güncellemeler sırasında Drupal'ın durumu hakkında hiçbir garanti olmadığı için tanıtıldı.
Eelke Blok
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.