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


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.