ฉันมีฟังก์ชั่น hook_post_update อย่างง่ายซึ่งล้มเหลวโดยมีข้อผิดพลาดดังต่อไปนี้:
[ประกาศ] เริ่มการอัปเดตแล้ว: ssc_custom_post_update_9001
[ข้อผิดพลาด] LogicException: บริบทการแสดงผลว่างเปล่า เนื่องจากมีการเรียกใช้การเรนเดอร์ () นอกการเรียกเรนเดอร์รูท () หรือเรนเดอร์เพลน () ใช้
renderPlain()/renderRoot() หรือ #lazy_builder/#pre_render แทน ใน
Drupal\Core\Render\Renderer->doRender() (บรรทัดที่ 244 ของ
E:\www\myssc\html\core\lib\Drupal\Core\Render\Renderer.php)
[ข้อผิดพลาด] บริบทการแสดงผลว่างเปล่า เนื่องจากมีการเรียกใช้การเรนเดอร์ () นอกการเรียกเรนเดอร์รูท () หรือเรนเดอร์เพลน () ใช้
renderPlain()/renderRoot() หรือ #lazy_builder/#pre_render แทน
[ข้อผิดพลาด] การอัปเดตล้มเหลว: ssc_custom_post_update_9001
ใน ProcessBase.php บรรทัดที่ 171:
ไม่สามารถถอดรหัสเอาต์พุตเป็น JSON: ข้อผิดพลาดทางไวยากรณ์
[ข้อผิดพลาด] [โหนด] [2022-03-12T04:58:35] LogicException: บริบทการแสดงผล
ว่างเปล่า เนื่องจากมีการเรียก render() ภายนอกของ renderRoot() หรือ
การเรียก renderPlain() ใช้ renderPlain()/renderRoot() หรือ
#lazy_builder/#pre_re แทน ใน Drupal\Core\Render\Renderer->doRender() (บรรทัดที่ 244 ของ
E:\www\myssc\html\core\lib\Drupal\C ore\Render\Renderer.php) | uid:
0 | คำขอ-uri: http://default/ | อ้างอิง: | ไอพี: 127.0.0.1 | ลิงค์:
{
"0": {
"ssc_custom": {
"9001": {
"#ยกเลิก": {
"สำเร็จ": เท็จ
"แบบสอบถาม": "Drupal\Core\Entity\EntityStorageException:
บริบท Ren der ว่างเปล่า เนื่องจากมีการเรียก render() นอก a
การเรียก renderRoot() หรือ renderPlain() ใช้ re nderPlain()/renderRoot()
หรือ #lazy_builder/#pre_render แทน ใน Drupal\Core\Ent
ity\Sql\SqlContentEntityStorage->save() (บรรทัดที่ 810 ของ E:\www\myssc\html\core\lib\Drupal\Core\Entity\Sql\SqlContentEntityStorage.php)"
}
}
},
"#ยกเลิก": [
"ssc_custom_post_update_9001"
]
},
"drush_batch_process_finished": จริง }
ฉันได้ถอดรหัสออกจนเหลือน้อยที่สุด:
ใช้ Drupal\Core\Entity\EntityStorageInterface;
ใช้ Drupal\Core\Entity\EntityTypeManagerInterface;
ใช้ Drupal\node\NodeInterface;
ฟังก์ชัน ssc_custom_post_update_9001(&$แซนด์บ็อกซ์) {
/** @var \Drupal\node\NodeStorageInterface $node_storage */
$node_storage = \Drupal::entityTypeManager()->getStorage('โหนด');
// จำนวนเอนทิตีที่ต้องประมวลผลต่อชุด
$จำกัด = 5;
$node_ids = $node_storage->getQuery()
-> การเข้าถึงตรวจสอบ (เท็จ)
->เงื่อนไข ('ประเภท', 'บทความ')
->ช่วง(0, $จำกัด)
->ดำเนินการ ();
// โหลดเอนทิตี
$nodes = $node_storage->loadMultiple($node_ids);
/** @var \Drupal\node\NodeInterface $node */
foreach ($ โหนดเป็น $ โหนด) {
$node->setNewRevision();
$node->save();
}
$แซนด์บ็อกซ์['#เสร็จสิ้น'] = 1;
}
ถ้าฉันเรียกใช้รหัสเดียวกันโดยตรง (ไม่ใช่จาก drush updb) มันก็ทำงานได้ดี ทำงานจากเมนูผู้ดูแลระบบ "เรียกใช้การอัปเดต"; มันก็ล้มเหลวเช่นกัน (ดังนั้นจึงไม่ใช่ปัญหาที่น่าเบื่อ)
แสดงความคิดเห็น $node->save() และข้อผิดพลาดไม่เกิดขึ้น