हुक कैसे करें हुक_पॉस्ट_अपडेट करें ()


11

मॉड्यूल अपडेट करने के लिए Drupal 8 को पेशhook_post_update_NAME() किया गयाhook_update_n , जिसके कुछ लाभ हैं

प्रत्येक hook_post_update_NAME()को केवल एक बार चलना चाहिए, लेकिन कभी-कभी मैं इसे फिर से जोड़ना चाहता हूं, जैसे कि जब मैं विकास के दौरान अपडेट हुक को डिबग कर रहा हूं। इसके साथ hook_update_n, आप डेटाबेस में स्कीमा संस्करण को रीसेट कर सकते हैं ।

आप कैसे फिर से दौड़ते हैं hook_post_update_NAME()?

जवाबों:


11

"post_update" हुक जो चलाए गए हैं, उन्हें डेटाबेस में संग्रहीत किया जाता है, key_valueतालिका में, post_updateसंग्रह, लेकिन डेटा को क्रमबद्ध और सीधे अपडेट करने के लिए अजीब है।

मैंने ड्रि लिपि बनाने के लिए @ kiamlaluno के उत्तर से कुछ विवरणों का उपयोग किया, जिसका उपयोग आप एकल हुक को रीसेट करने के लिए कर सकते हैं। यहां एक मूल संस्करण ( लंबा संस्करण यहां है ):

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

और यहाँ एक उदाहरण है कि यह कैसा दिखता है जब आप इसे कमांड लाइन से चलाते हैं:

./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
क्या आपने इसे वापस करने में योगदान देने के बारे में सोचा है, github.com/drush-ops/drush ?
powpow12

1
यह एक बहुत ही प्यारी सुविधा है, लेकिन कोर ड्रश के लिए यह थोड़ा बहुत आला है। शायद कोई इसके लिए कमांडफाइल बनाए।
मोशे वीट्ज़मैन

3

यहाँ एक उदाहरण है जिसे आप कमांड लाइन से ड्रश 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);'

जब आप ड्रूड अपडेटब को फिर से चलाते हैं तो आप अपने पोस्ट_अपडेट_हूक को चलने का इंतजार करते हुए देखेंगे।


यह मेरे लिए अच्छी तरह से काम करता है, बस यह उल्लेख करने के लिए कि ड्रश 9 में, यह हैdrush php:eval 'command'
powpow12

बहुत उपयोगी है, अगर केवल पढ़ने के लिए पर्यावरण पर। बहुत धन्यवाद;)
मिरसॉफ्ट

1

UpdateRegistry::getPendingUpdateFunctions()निम्नलिखित कोड शामिल हैं। देखें कि टिप्पणी क्या कहती है।

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

UpdateRegistry :: $ updateType पर सेट है 'post_update'। के मान
$this->keyValueसे सेट UpdateRegistryFactory::create()किया गया है $this->container->get('keyvalue')->get('post_update')

समतुल्य प्रक्रियात्मक कोड जो कीवल्यू संग्रह प्राप्त करने के लिए निम्नलिखित है।

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

सेट existing_updates एक खाली सरणी के लिए, और Drupal सोचेंगे पोस्ट अद्यतन कॉलबैक में से कोई भी बुलाया गया है।

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

के कॉलबैक नाम निकालें existing_updates कि keyvalue की कुंजी है, और Drupal कि पोस्ट अद्यतन कॉलबैक अभी तक लागू नहीं किया गया है सोचेंगे।


0

इसे भीतर से बुलाओ hook_update_n()और फिर वही करो जो तुम पहले कर रहे थे।


1
यह एक अच्छा विचार नहीं लगता है, क्योंकि हुक_पॉस्ट_अपडेट मैकेनिज्म के लिए संपूर्ण उद्देश्य सभी अपडेट चलने के बाद पूरी तरह कार्यात्मक ड्रुपल उपलब्ध होना है । इसे पेश किया गया था क्योंकि अपडेट के दौरान Drupal की स्थिति के बारे में कोई गारंटी नहीं है।
इलके ब्लोक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.