ทำความเข้าใจเกี่ยวกับ Update และ Post Update Hooks สำหรับการอัปเดตไซต์ Drupal ที่ประสบความสำเร็จ

เผยแพร่แล้ว: 2023-04-25

ระหว่างการอัปเดตหลักหรือการอัปเดตโมดูล สิ่งสำคัญคือต้องรับประกันความเสถียรและความสมบูรณ์ของเว็บไซต์ Drupal ของคุณ โชคดีที่โมดูล Update API และ Update/Post Update Hooks พร้อมให้ความช่วยเหลือ

โมดูล Update API มี hooks ที่จำเป็นสำหรับการอัพเดตโค้ดและโมดูลบนไซต์ Drupal ของคุณ hooks เหล่านี้ไม่มีอะไรนอกจาก Update และ Post-Update Hooks ซึ่งช่วยให้นักพัฒนาสามารถปรับแต่งการอัพเดทตามความต้องการได้

ในบทความนี้ เราจะพูดถึง Update API, hooks ของ update และ post-update คืออะไร และควรใช้เมื่อใดและอย่างไร เมื่อเข้าใจ hook ทั้งสองประเภทแล้ว คุณจะอัปเดตไซต์ Drupal ได้สำเร็จโดยใช้ความพยายามเพียงเล็กน้อย มาเริ่มกันเลย!

อัปเดตและโพสต์อัปเดต hooks

อัปเดต API

ขณะทำงานในไซต์ที่มีอยู่ เมื่อคุณอัปเดตโค้ดในโมดูล คุณอาจต้องอัปเดตข้อมูลที่เก็บไว้เพื่อให้ข้อมูลที่เก็บไว้เข้ากันได้กับโค้ดใหม่ คุณอาจสังเกตเห็นข้อผิดพลาด เช่น 'เว็บไซต์พบข้อผิดพลาดที่ไม่คาดคิด' ปรากฏขึ้นตรงหน้าคุณ น่ากลัวใช่มั้ย!? ฉันรู้! นี่คือจุดที่ Update API ของ Drupal มาช่วยเรา

หากการอัปเดตอยู่ระหว่างเวอร์ชันรองสองเวอร์ชันของโมดูลภายใน Drupal core เวอร์ชันหลักเดียวกัน คุณสามารถใช้ Update API เพื่ออัปเดตข้อมูลได้ Update API ช่วยให้คุณสามารถระบุรหัสที่ดำเนินการอัปเดตข้อมูลที่เก็บไว้เมื่อใดก็ตามที่โมดูลของคุณทำการเปลี่ยนแปลงรูปแบบข้อมูล การเปลี่ยนแปลงรูปแบบข้อมูลหมายถึงการเปลี่ยนแปลงใดๆ ที่ทำให้ข้อมูลที่เก็บไว้บนไซต์ที่มีอยู่เข้ากันไม่ได้กับโค้ดเบสที่อัปเดตของไซต์นั้น การเปลี่ยนแปลงโมเดลข้อมูลเหล่านี้เกี่ยวข้องกับ:

การอัปเดต Configuration Schema

  • การเพิ่ม/ลบ/เปลี่ยนชื่อคีย์การกำหนดค่า
  • การเปลี่ยนประเภทข้อมูลของคีย์การกำหนดค่า
  • การเปลี่ยนค่าเริ่มต้นที่คาดไว้ของคีย์การกำหนดค่า ฯลฯ

การอัปเดตสคีมาฐานข้อมูล

  • การเพิ่ม/เปลี่ยน/ลบตารางฐานข้อมูลหรือฟิลด์
  • การย้ายข้อมูลที่เก็บไว้ไปยังเขตข้อมูลหรือตารางอื่น
  • การเปลี่ยนรูปแบบข้อมูลที่จัดเก็บ เป็นต้น

การอัปเดตเอนทิตีและฟิลด์

  • การเพิ่มฟิลด์พื้นฐานใหม่ให้กับประเภทเอนทิตีที่มีอยู่
  • การอัปเดตฟิลด์จากประเภทที่ล้าสมัยเป็นประเภทใหม่ ฯลฯ

การอัปเดตข้อมูล

  • จัดการข้อมูลที่จัดเก็บไว้ในไซต์ที่มีอยู่

การทำงานกับ Update hooks

Hook hook_update_N() ใช้เพื่อแนะนำการอัปเดตระหว่างเวอร์ชันย่อยของโมดูล ตะขอเหล่านี้จะอยู่ในโมดูลของคุณในไฟล์ *.install

hook_update_N() ถูกเขียนในรูปแบบของ (ชื่อโมดูล)_update_(number) ที่นี่ N ประกอบด้วย:

  • ตัวเลข 1 หรือ 2 หลักหมายถึงความเข้ากันได้ของ Drupal core (Drupal 8, 9, 10 เป็นต้น)
  • ตัวเลข 1 หลักถัดไปคือเวอร์ชันรีลีสหลักของโมดูลของคุณ
  • เลขท้าย 2 ตัวสำหรับการนับตามลำดับ เริ่มต้นด้วย 01

ตัวอย่าง:

example_update_9201(): การอัปเดตครั้งแรกสำหรับเวอร์ชัน 9.x-2.x
โดยที่ 'example' คือชื่อของโมดูล ตัวเลขหลักแรกหมายถึง Drupal core เวอร์ชัน '9' ตัวเลข '2' หมายถึงเวอร์ชันเผยแพร่หลักของโมดูล และเลข 2 หลักสุดท้าย '01' หมายถึงฟังก์ชันการอัปเดตแรกที่เขียนขึ้นสำหรับ โมดูล 'ตัวอย่าง'

ส่วนที่เป็นตัวเลขของฟังก์ชันการใช้งาน hook (เช่น 9201 ในตัวอย่างด้านบน) จะถูกจัดเก็บไว้ในฐานข้อมูลเพื่อติดตามว่าการอัปเดตใดได้รับการดำเนินการแล้ว ดังนั้นคุณจึงไม่ควรเรียงลำดับฟังก์ชันการอัพเดทใหม่
หากต้องการทราบเวอร์ชันสคีมาปัจจุบันของโมดูล 'ตัวอย่างที่จัดเก็บไว้ในฐานข้อมูล' ให้ใช้:

drush php-eval "echo drupal_get_installed_schema_version('ตัวอย่าง');"

เวอร์ชันสคีมา

หากต้องการตั้งค่าเวอร์ชันสคีมาปัจจุบันของโมดูล 'ตัวอย่าง' กลับเป็น '9201' ด้วยตนเอง ให้ใช้:

drush php-eval "echo drupal_set_installed_schema_version('ตัวอย่าง', '9201');"

กำหนดค่าสคีมาด้วยตนเอง

หมายเหตุ: โปรดพยายามหลีกเลี่ยงการใช้ฟังก์ชัน drupal_set_installed_schema_version() บนไซต์ที่ใช้งานจริง เนื่องจากจะอัปเดตฐานข้อมูลของคุณโดยตรง คุณสามารถใช้มันกับสภาพแวดล้อมการทดสอบในเครื่องหรือต่ำกว่าในระหว่างการพัฒนาเพื่อรีเซ็ตเวอร์ชันสคีมา

เพิ่มคำอธิบายที่เหมาะสมในความคิดเห็นบล็อกเอกสารก่อนฟังก์ชัน hook อัปเดต เนื่องจากจะถูกพิมพ์สำหรับผู้ใช้ขณะเรียกใช้

 Structure of hook_update_N(): /** * A aimple hook_update_N() hook. */ function example_update_9201() { // Code goes here. }

hooks เหล่านี้ดำเนินการตามลำดับการเรียงลำดับ เช่น example_update_9201() hook ดำเนินการก่อน example_update_9202() ถัดไปคือ 9203, 9204 และอื่นๆ

คุณยังสามารถเปลี่ยนลำดับการจัดเรียงของ hook เหล่านี้ได้ด้วยการแนะนำการอ้างอิงระหว่าง hooks ใช้ hook hook_update_dependencies() เพื่อเรียกใช้การอัปเดตระหว่างสอง hooks การอัปเดต

ส่วนประกอบปฏิกิริยา

เบ็ดการอัพเดททั้งหมดจะดำเนินการเป็นชุดและยังรองรับการประมวลผลรายการเป็นชุด ตะขออัปเดตทั้งหมดมีสิทธิ์เข้าถึงพารามิเตอร์ $sandbox ซึ่งสามารถใช้สร้างกระบวนการแบบแบตช์ในตะขออัปเดตเพื่อประมวลผลข้อมูลขนาดใหญ่พร้อมกันโดยไม่ทำให้ PHP หมดเวลา

ตัวอย่างง่ายๆ ของ hook อัปเดตเพื่อเพิ่มคีย์การกำหนดค่าใหม่:

ขณะนี้ ไฟล์ example_module.settings.yml ประกอบด้วย:

การตั้งค่าโมดูล

อัปเดตเบ็ด

ในการเพิ่ม 'คำอธิบาย' คีย์ใหม่ให้กับการกำหนดค่า:

  • เพิ่มคีย์ 'description' ลงในไฟล์การตั้งค่า
คำอธิบายการกำหนดค่า

  • เพิ่ม update_hook ในไฟล์ example_module.install:
ติดตั้งโมดูล

  • ใช้ drush updb เพื่อเรียกใช้เบ็ด
ใช้การปรับปรุงเบ็ด

  • ตรวจสอบการกำหนดค่าที่อัปเดต คีย์ใหม่ 'คำอธิบาย' ได้รับการอัปเดต
คำอธิบายการกำหนดค่า

การทำงานกับ hooks ของ Post Update

Hook hook_post_update_NAME() คล้ายกับ hook อัปเดต ใช้เพื่อแนะนำการอัปเดต แต่ตะขอนี้มีไว้เพื่ออัปเดตข้อมูลเป็นส่วนใหญ่ เช่น เอนทิตี ตะขอเหล่านี้ถูกเรียกใช้งาน หลังจาก เรียกใช้ hook_update_N() ทั้งหมดแล้ว ในขั้นตอนนี้ Drupal ได้รับการซ่อมแซมอย่างสมบูรณ์แล้ว ดังนั้นคุณจึงสามารถใช้ API ใดก็ได้ภายในไซต์

hooks เหล่านี้อยู่ในไฟล์ *.post_update.php ในโมดูลของคุณ

hook_post_update_NAME() ถูกเขียนในรูปแบบของ (ชื่อโมดูล)_post_update_(ชื่อใดก็ได้) ที่นี่ NAME สามารถเป็นชื่อเครื่องใดก็ได้ การตั้งชื่อฟังก์ชันที่เป็นตัวอักษรและตัวเลขในไฟล์เป็นสิ่งเดียวที่รับประกันคำสั่งการดำเนินการของ hook นี้

เช่นเดียวกับการอัพเดท hooks ให้เพิ่มคำอธิบายที่เหมาะสมในความคิดเห็น docblock ก่อน post_update hook นอกจากนี้ อย่าใช้ชื่อ hook เดิมซ้ำ

โครงสร้างของ hook_post_update_NAME():

 /** * A aimple hook_post_update_NAME() hook. */ function example_post_update_test() { // Code goes here. }

เช่นเดียวกับการอัพเดท hook ให้ใช้พารามิเตอร์ $sandbox เพื่อระบุว่าควรใช้ Batch API สำหรับ post_update hooks ของคุณ

ตัวอย่างง่ายๆ ในการใช้ hook หลังการอัปเดตเพื่ออัปเดตข้อมูลคำศัพท์:

  • ปัจจุบัน คำศัพท์ทั้งหมดภายใต้แท็กคำศัพท์ได้ปิดใช้งานฟิลด์ 'ตัวอย่างการทดสอบ'
แก้ไขคำ
  • เพิ่ม post_update hook ในไฟล์ example_module.post_update.php เพื่อเปิดใช้งานฟิลด์ 'ตัวอย่างการทดสอบ' สำหรับคำศัพท์ที่มีอยู่ทั้งหมด
โพสต์อัปเดต

  • ใช้ drush updb เพื่อเรียกใช้เบ็ด
drush updb

  • ตรวจสอบข้อมูลคำศัพท์ที่อัปเดต ต้องเปิดใช้งานช่องทำเครื่องหมาย 'ตัวอย่างการทดสอบ'
ข้อมูลระยะ

วิธีเรียกใช้ตะขอเหล่านี้!

คุณสามารถใช้คำสั่ง Drush เพื่อเรียกใช้ hooks เหล่านี้ drush updb จะสร้างแบตช์ตามขั้นตอนต่อไปนี้:

  • มีการค้นพบ hooks การอัปเดตทั้งหมด
  • แก้ไขการพึ่งพาและเรียงลำดับของพวกเขา
  • มีการวางตะขอสำหรับการประมวลผลเป็นชุด
  • ถัดไป ค้นพบ hooks ของโพสต์ทั้งหมด
  • หากมี post_update hooks และถ้า update_hook เคยทำงานมาก่อน แคชจะถูกล้าง
  • จากนั้นกดแต่ละตะขอ post_update ลงในแบทช์
  • ดำเนินการแบทช์

ข้อได้เปรียบที่สำคัญอย่างหนึ่งที่ hook หลังการอัปเดตมีเหนือ hook การอัปเดตคือ Drupal ทำงานได้อย่างสมบูรณ์ในเวลาที่เรียกใช้หลังการอัปเดต สิ่งนี้ทำให้นักพัฒนาสามารถใช้บริการ Drupal ใด ๆ ในขณะที่ใช้เบ็ดหลังการอัปเดต ด้วย hook การอัปเดต เราต้องไม่ถือว่า Drupal ได้รับการซ่อมแซมอย่างสมบูรณ์ และหลีกเลี่ยงการเรียกใช้ hooks อื่น ๆ, API ของเอนทิตี ฯลฯ

ความคิดสุดท้าย

เมื่อพยายามแก้ไขไซต์ของคุณโดยอัปเดต config/database schema ให้ลองใช้ hooks อัปเดต เมื่อจัดการกับข้อมูลที่เก็บไว้ บันทึกการกำหนดค่าใหม่ อัปเดตเอนทิตีเนื้อหา ล้างแคช ฯลฯ แล้ว hook หลังการอัปเดตจะเหมาะสมกว่าที่จะใช้

ตามจริงแล้ว ไม่มีเอกสารที่ชัดเจนบน Drupal.org ว่าควรใช้เบ็ดตัวใดเมื่อใด! มีปัญหาเปิดอยู่ซึ่งขอให้ปรับปรุงเอกสารเกี่ยวกับการใช้ตะขอทั้งสองนี้ ซึ่งคุณสามารถมีส่วนร่วมได้หากต้องการ

แต่จากประสบการณ์ของนักพัฒนาและโดยการดูที่โมดูลหลัก Drupal 9 & 10 เป็นตัวอย่าง ให้ใช้ hooks อัปเดตเพื่อดำเนินการ CRUD ในการกำหนดค่าหรือฐานข้อมูล (เช่น ซ่อมแซมไซต์) และใช้ hooks หลังการอัปเดตสำหรับเอนทิตีเนื้อหา CRUD ( จากนั้นแก้ไขข้อมูลบนไซต์ที่อัปเดต) เนื่องจาก hooks หลังการอัปเดตจะทำงานหลังจากอัปเดต hooks

สนุกกับการอ่านบทความนี้? แสดงความรักและสมัครรับจดหมายข่าวรายสัปดาห์ของเราวันนี้!