วิธีเรียกใช้ซ้ำ hook_post_update_NAME ()


11

Drupal 8 แนะนำhook_post_update_NAME()ซึ่งมีประโยชน์บางอย่างhook_update_nสำหรับการปรับปรุงโมดูล

แต่ละคนhook_post_update_NAME()ควรรันเพียงครั้งเดียว แต่บางครั้งฉันต้องการรันซ้ำเช่นเมื่อฉันทำการดีบัก hook การอัพเดทในระหว่างการพัฒนา ด้วยhook_update_nคุณสามารถตั้งค่ารุ่นสคีมาในฐานข้อมูล

คุณวิ่งใหม่ได้hook_post_update_NAME()อย่างไร

คำตอบ:


11

"post_update" hooks ที่ถูกเรียกใช้จะถูกเก็บไว้ในฐานข้อมูลใน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
นี่เป็นคุณสมบัติที่น่ารัก แต่ก็ดูแคบเกินไปสำหรับ Core Drush บางทีมีคนสร้าง commandfile ขึ้นมา
moshe weitzman

3

นี่คือตัวอย่างที่คุณสามารถใช้จากบรรทัดคำสั่งด้วย 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);'

เมื่อคุณเรียกใช้ drush ที่อัปเดตใหม่แล้วคุณจะเห็น post_update_hook รออยู่


มันใช้งานได้ดีสำหรับฉันเพียงแค่พูดถึงว่าใน drush 9 มันเป็นdrush php:eval 'command'
powpow12

มีประโยชน์มากถ้าอยู่ในสภาพแวดล้อมแบบอ่านอย่างเดียว ขอบคุณมาก;)
Mirsoft

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

โค้ดโพรซีเดอร์ที่เทียบเท่าเพื่อรับค่าคอลเลกชัน keyvalue นั้นเป็นรหัสต่อไปนี้

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

ตั้งค่าparent_updatesเป็นอาร์เรย์ว่างและ Drupal จะคิดว่าไม่มีการเรียกการเรียกคืนการโพสต์การอัปเดต

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

ลบชื่อการติดต่อกลับออกจากคีย์existing_updatesของ keyvalue นั้นและ Drupal จะคิดว่าโพสต์การโทรกลับการอัปเดตนั้นยังไม่ถูกเรียกใช้


0

โทรจากภายในhook_update_n()แล้วทำสิ่งที่คุณเคยทำมาก่อน


1
ดูเหมือนจะไม่เป็นความคิดที่ดีเนื่องจากวัตถุประสงค์ทั้งหมดสำหรับกลไก hook_post_update คือการให้ Drupal ทำงานได้อย่างสมบูรณ์หลังจากการอัปเดตทั้งหมดทำงานแล้ว มีการนำมาใช้เนื่องจากไม่มีการรับประกันเกี่ยวกับสถานะของ Drupal ในระหว่างการอัพเดต
Eelke Blok
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.