Score:2

ไม่ควร hook_update เพื่อเพิ่มฟิลด์ใหม่ให้กับเอนทิตีโดยใช้ข้อกำหนดฟิลด์จากคลาสเอนทิตี

ธง hk

ฉันเขียน hook อัปเดตเพื่อเพิ่มฟิลด์ใหม่ให้กับเอนทิตีที่กำหนดเองและทำตามรูปแบบที่แสดงที่นี่

https://www.drupal.org/node/2554097

/**
 * เพิ่มฟิลด์ 'revision_translation_affected' ให้กับเอนทิตี 'node'
 */
ฟังก์ชัน node_update_8001() {
  // ติดตั้งคำจำกัดความที่ฟิลด์นี้มี
  // \Drupal\node\Entity\Node::baseFieldDefinitions()
  // ณ เวลาที่เขียนฟังก์ชันอัพเดตนี้ ถ้า / เมื่อเป็นรหัส
  // ปรับใช้ที่เปลี่ยนคำจำกัดความนั้น โมดูลที่เกี่ยวข้องจะต้อง
  // ใช้ฟังก์ชั่นอัพเดทที่เรียกใช้
  // \Drupal::entityDefinitionUpdateManager()->updateFieldStorageDefinition()
  // กับนิยามใหม่
  $storage_definition = BaseFieldDefinition::create('บูลีน')
      ->setLabel(t('การแก้ไขการแปลได้รับผลกระทบ'))
      ->setDescription(t('ระบุว่าการแก้ไขล่าสุดของการแปลเป็นของการแก้ไขปัจจุบันหรือไม่'))
      ->ตั้งค่าอ่านอย่างเดียว(จริง)
      ->ตั้งค่าแก้ไขได้(จริง)
      ->setTranslatable(จริง);

  \Drupal::entityDefinitionUpdateManager()
    ->installFieldStorageDefinition('revision_translation_affected', 'node', 'node', $storage_definition);
}

ฉันรู้สึกว่าฉันกำลังทำซ้ำ BaseFieldDefinition ทั้งในคลาสเอนทิตีที่กำหนดเองและในไฟล์ติดตั้ง ฉันไม่ควรใช้ฟังก์ชันคงที่

ฟังก์ชันสแตติกสาธารณะ baseFieldDefinitions (EntityTypeInterface $entity_type) 

จากคลาสเอนทิตีเพื่อโหลดข้อกำหนดของฟิลด์และติดตั้งหรือไม่

No Sssweat avatar
ua flag
For historical purposes, I think it's best practice not to.
4uk4 avatar
cn flag
Yes, historical in the sense of code revisions. The code update could contain multiple changes at one time while update hooks need to process the changes step by step.
hk flag
ขอบคุณ. เข้าใจแล้ว.
Score:3
ธง us

การใช้วัตถุที่ส่งคืนโดย Drupal::entityDefinitionUpdateManager() เป็นวิธีที่ถูกต้องในการอัปเดตฟิลด์เอนทิตีด้วยเหตุผลเดียวกัน hook_update_N() การใช้งานจะไม่เรียกใด ๆ hook_schema() การดำเนินการปรับปรุงเขตข้อมูลฐานข้อมูล

ลองนึกภาพว่าคุณเปลี่ยนเอนทิตีในภายหลังและเปลี่ยนชื่อฟิลด์นั้นจาก revision_translation_affected ถึง การแปล_ได้รับผลกระทบ. หาก hook อัปเดตที่คุณเขียนตอนนี้ใช้อาร์เรย์ที่ส่งคืนจาก คำจำกัดความของเขตข้อมูลพื้นฐาน () และเก็บไว้ใน $ฟิลด์มันจะไม่พบค่าใด ๆ สำหรับ ฟิลด์['revision_translation_affected'], เนื่องจาก คำจำกัดความของเขตข้อมูลพื้นฐาน () ได้รับการอัปเดตแล้วเพื่อส่งคืนฟิลด์ที่เปลี่ยนชื่อ

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

hk flag
ขอบคุณสำหรับคำอธิบายโดยละเอียด @apaderno นั่นสมเหตุสมผลดี

โพสต์คำตอบ

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