Score:1

เมธอด getTitle() ส่งคืนค่าที่ไม่คาดคิด สาเหตุนี้คืออะไร?

ธง kz

ในการดำเนินการของ hook_node_insert()ฉันมีรหัสสามบรรทัดต่อไปนี้:

dpm($เอนทิตี, 'เอนทิตี');
$title = $entity->getTitle();
dpm($ชื่อ, 'ชื่อเรื่อง');

จากครั้งแรก รอบต่อนาที () ฉันเข้าใจ:

นิติบุคคล =>
Drupal\node\Entity\Node {#1632 â¼
  +in_preview: เป็นโมฆะ
  #values: อาร์เรย์:27 [â¼
    ...
    "title" => อาร์เรย์:1 [â¼
       "x-default" => อาร์เรย์:1 [â¼
        0 => อาร์เรย์:1 [â¼
          "value" => "ชื่อที่ต้องการ"
        ]
     ]
...

เช่น. เอาต์พุตฟิลด์หัวเรื่องโดยรถดัมพ์ตัวแปรคือฟิลด์หัวเรื่องที่ฉันคาดว่าจะเห็น

ที่สอง รอบต่อนาที () ผลิต:

ชื่อเรื่อง =>
"ชื่อก่อนหน้า"

เช่น. เมื่อฉันแยกชื่อเรื่องออกจากเอนทิตีโดยใช้ getTitle() วิธีการ ฉันได้รับ แตกต่าง ค่า. ค่านี้มาจากเอนทิตี (โหนด) ที่ฉันโหลดในตัวควบคุมการเชื่อมโยงการดำเนินงาน (แทนที่ ฐานคอนโทรลเลอร์) แต่ไม่ได้บันทึกไว้ในตัวควบคุม และไม่ควรเริ่มทำงาน hook_node_insert().

ฉันสร้างและบันทึกโหนดใหม่ในคอนโทรลเลอร์โดยใช้รหัสนี้:

$node = \Drupal::entityTypeManager()->getStorage('node')->create([
  'type' => 'my_type',
  'ร่างกาย' => 'ร่างกาย',
]);
$node->setTitle('ชื่อเรื่องที่ต้องการ');
$node->save();

ฉันถือว่านี่คือ $node->save();ที่ไฟ hook_node_insert.

เกิดขึ้นที่นี่คืออะไร?

เหตุใดชื่อเรื่องหลอกลวงจึงปรากฏในท่อนฮุก และฉันจะได้รับผลลัพธ์ที่คาดหวังได้อย่างไร

สำหรับบันทึก: ฉันไม่ได้เปลี่ยนโหนดใน hook_node_insert. ฉันจะลบออกหากชื่อเรื่องตรงตามเกณฑ์ที่กำหนด ฉันไม่สามารถใช้ข้อจำกัดเพื่อป้องกันไม่ให้สร้างขึ้นด้วยเหตุผลที่ไม่เกี่ยวข้องกับคำถามนี้

4uk4 avatar
cn flag
ไม่ใช่เรื่องง่ายที่จะปฏิบัติตามด้วยเหตุผลหลายประการ อาร์เรย์ค่าที่ได้รับการป้องกันในเอนทิตีเนื้อหาไม่ควรอ่านด้วยรหัสที่กำหนดเอง มันมีค่าดั้งเดิมเสมอ x-default เป็นค่าคงที่สำหรับภาษาเริ่มต้น ดังนั้นจึงเป็นเรื่องปกติที่ getTitle() จะส่งกลับผลลัพธ์ที่แตกต่างกัน dpm() ไม่ใช่เครื่องมือแก้ไขข้อบกพร่องตามเวลาจริง จะส่งเอาต์พุตในเซสชันซึ่งบางครั้งจะแสดงคำขอหนึ่งหรือสองรายการในภายหลัง ขึ้นอยู่กับว่าบล็อกข้อความจะแสดงในครั้งต่อไปเมื่อใด ลอง Xdebug นอกจากนี้ hook_node_insert() ยังสายเกินไปที่จะเปลี่ยนโหนด ให้ใช้ hook ที่บันทึกไว้ล่วงหน้า
Free Radical avatar
kz flag
@ 4uk4 ฉันคิดว่าวิธีการที่คลาสจัดเตรียมไว้สำหรับการรับค่าที่ได้รับการป้องกันนั้นควรจะส่งคืนค่าจริงของฟิลด์ ฉันประหลาดใจที่รู้ว่าสิ่งนี้ไม่เป็นความจริงเสมอไป ขอบคุณที่สะกิดฉันในทิศทางของ Xdebug
Score:1
ธง cn

ในเอนทิตีเนื้อหาที่ได้รับการป้องกัน ค่า $ อาร์เรย์ประกอบด้วยค่าดั้งเดิมของเอนทิตี ค่าฟิลด์จริงจะถูกเก็บไว้ในอาร์เรย์ที่ได้รับการป้องกัน $ฟิลด์ซึ่งเก็บอาร์เรย์ของวัตถุ FieldItemList สิ่งเหล่านี้ถูกสร้างขึ้นอย่างเกียจคร้าน ดังนั้นเมื่อโหนดถูกโหลด อาร์เรย์นี้จะว่างเปล่า เมื่อคุณได้รับ/ตั้งค่าฟิลด์ด้วยวิธีการและคุณสมบัติของเอนทิตีสาธารณะ วัตถุฟิลด์ที่มีข้อมูลจริงจะถูกสร้างขึ้นและจัดเก็บไว้ในอาร์เรย์ภายในนี้

เพื่อจุดประสงค์ในการดีบัก คุณสามารถบังคับให้ $ฟิลด์ อาร์เรย์ที่จะเติมข้อมูลโดยสมบูรณ์

$values ​​= $node->toArray();

ซึ่งจะส่งคืนค่าเอนทิตีโดยการสร้างวัตถุฟิลด์ทั้งหมดและสร้างอาร์เรย์ของค่าฟิลด์จริง

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

leymannx avatar
ne flag
จะเพิ่มข้อมูลบน hook และ Xdebug ความคิดเห็นของคุณคือทองคำ
Free Radical avatar
kz flag
ขอบคุณสำหรับคำตอบที่ให้ความรู้เกี่ยวกับวิธีการใช้เอนทิตีสาธารณะเพื่อเข้าถึงฟิลด์ที่มีการป้องกันทำงานอยู่เบื้องหลัง

โพสต์คำตอบ

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