ทำความเข้าใจเกี่ยวกับ 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 ได้สำเร็จโดยใช้ความพยายามเพียงเล็กน้อย มาเริ่มกันเลย!

อัปเดต 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 เพื่อเรียกใช้ 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
สนุกกับการอ่านบทความนี้? แสดงความรักและสมัครรับจดหมายข่าวรายสัปดาห์ของเราวันนี้!