Score:0

แคชเอนทิตีและฟิลด์ที่คำนวณ

ธง ph

ฉันมีเอนทิตีที่กำหนดเองซึ่งฉันได้เพิ่มฟิลด์ที่คำนวณแล้ว ดังนั้นคลาสที่เกี่ยวข้องคือ:

  • คลาส MyEntity ขยาย ContentEntityBase
  • คลาส ComputedFieldA ขยาย FieldItemList
  • คลาส ComputedFieldB ขยาย FieldItemList

ปัญหาของฉันคือฉันต้องการให้ฟิลด์ที่คำนวณไม่ถูกแคชเลย หรือแคชแต่ใช้กลยุทธ์อื่นที่ใช้ไม่ได้

สิ่งที่ฉันต้องการเป็นไปได้ไหม หรือฉันต้องทำให้แคชสำหรับเอนทิตีทั้งหมดเป็นโมฆะ

แก้ไข: ฟิลด์ที่กำหนดเองนั้นเป็นจำนวนแถวในตารางฐานข้อมูลอื่นฉันต้องการให้แคชการนับนั้นแยกกัน จากนั้นทำให้ใช้ไม่ได้หากมีการแทรกแถวใหม่

กำลังใช้เอาต์พุตผ่านจุดสิ้นสุด jsonapi เริ่มต้นสำหรับเอนทิตี

แก้ไข 2: ฉันเดาว่ามันซับซ้อนกว่าที่ฉันคิดดังนั้นฉันจะอธิบายรายละเอียดเพิ่มเติม:

นิติบุคคล A:

  • มีความสัมพันธ์แบบ 1:1 กับโหนดตาม UUID
  • มีจำนวนเอนทิตี B ที่เกี่ยวข้องกับโหนด (คำนวณ)
  • มีการคำนวณตามจำนวนนั้น (คำนวณ)

เอนทิตี B:

  • มีความสัมพันธ์แบบ N:1 กับโหนดตาม NID

ดังนั้น หากมีการสร้างเอนทิตี B ใหม่สำหรับโหนด X ฉันต้องการให้แคชใช้ไม่ได้ในฟิลด์ที่คำนวณแล้วสองฟิลด์ของเอนทิตี A สำหรับโหนด XXXX-XXXX-XXXX-XXXX เพื่อให้จุดสิ้นสุด jsonapi แสดงข้อมูลที่คำนวณล่าสุด

ถ้าฉันสามารถเพิ่มแท็กแคชของ node:X ในแต่ละอินสแตนซ์ของฟิลด์ที่คำนวณได้ ฉันคาดหวังว่าจะได้สิ่งที่ฉันต้องการ

4uk4 avatar
cn flag
การแก้ไขเป็นเหมือนคำถามใหม่ ตารางฐานข้อมูลอื่นนี้เป็นตารางเอนทิตีด้วยหรือไม่ ถ้าใช่ คุณสามารถใช้ CRUD hooks ของเอนทิตีนั้นเพื่อทำให้เอนทิตีนี้ใช้ไม่ได้ หรือคุณสามารถเพิ่มแท็กเอนทิตีของเอนทิตีอื่นลงในฟิลด์เพื่อให้เอนทิตีใช้ไม่ได้โดยอัตโนมัติในการดำเนินการ CRUD ถ้าไม่ คุณต้องใช้สิ่งที่คล้ายกันด้วยตัวเอง
4uk4 avatar
cn flag
แก้ไข 2: หากเนื้อหานี้เกี่ยวกับประเภทเนื้อหาที่แตกต่างกัน แท็กรายการบันเดิลใหม่อาจมีประโยชน์ ดู https://www.drupal.org/node/3107058
Lambic avatar
ph flag
ไม่ ไม่เกี่ยวกับเนื้อหาประเภทต่างๆ เอนทิตี A และเอนทิตี B เป็นเอนทิตีตารางเดียวที่กำหนดเองล้วน แต่เอนทิตี A มีฟิลด์ uuid ที่อ้างถึงโหนดเฉพาะ และเอนทิตี B มีฟิลด์นิดที่อ้างถึงโหนดเดียวกัน
4uk4 avatar
cn flag
ตกลง จากนั้นใช้แท็ก `entity_b_list`
Lambic avatar
ph flag
นั่นอาจใช้งานได้ แต่ฉันไม่แน่ใจว่าจะเพิ่มแท็กนั้นที่ใด ในนิยามเอนทิตี? การใช้งาน FieldItemList? ที่อื่น?
4uk4 avatar
cn flag
สำหรับโมดูลฟิลด์สากลที่ต้องการการแคช วิธีที่ตรงไปตรงมาที่สุดน่าจะเป็นตัวสร้างมาตรฐานที่กำหนดเองสำหรับ FieldItemList ซึ่งสามารถส่งคืนวัตถุ CacheableNormalization พร้อมแท็กแคช ดูความคิดเห็นของฉันใต้คำตอบ หากคุณกำลังมองหาวิธีแก้ปัญหาง่ายๆ สำหรับกรณีเฉพาะนี้ คุณสามารถใช้ hook `mymodule_entity_a_load()` และเพิ่มแท็กแคชให้กับเอนทิตี ดู https://stackoverflow.com/questions/68523829/how-do-i-control-the-cacheability-of-a-node-rendered-through-jsonapi-in-drupal
Lambic avatar
ph flag
ฉันจะถูกบ่นเรื่องการใช้ hook ในการตรวจสอบโค้ด แต่นั่นดูเหมือนจะเป็นวิธีแก้ปัญหาที่ตรงไปตรงมาที่สุด ขอบคุณ!
4uk4 avatar
cn flag
การใช้งาน hook เป็นสิ่งที่ฉันพบที่ SO หากวิธีนี้ได้ผล คุณสามารถเพิ่มแท็กรายการไปยังคลาสเอนทิตีได้เช่นกัน ดูคำตอบที่แก้ไขแล้ว
Score:3
ธง cn

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

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

แก้ไข 2:

คลาสเอนทิตีสามารถเพิ่มแท็กรายการแคชสำหรับเอนทิตี b:

คลาส MyEntity ขยาย ContentEntityBase {

  /**
   * {@inheritdoc}
   */
  ฟังก์ชั่นสาธารณะ getCacheTags () {
    $cache_tags = parent::getCacheTags();
    $cache_tags[] = 'entity_b_list';
    ส่งคืน $cache_tags;
  }
Lambic avatar
ph flag
ดูเหมือนว่าฉันต้องกำหนดรูปแบบฟิลด์ของตัวเองสำหรับฟิลด์ที่ฉันต้องการแคชพิเศษ ฉันใช้ผลลัพธ์สุดท้ายผ่าน jsonapi หรือไม่
4uk4 avatar
cn flag
จากนั้นกำหนด FieldNormalizer ด้วย `protected $supportedInterfaceOrClass = ComputedFieldA::class;'

โพสต์คำตอบ

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