Tôi có một hàm hook_post_update đơn giản không thành công với lỗi sau:
[thông báo] Cập nhật bắt đầu: ssc_custom_post_update_9001
[lỗi] LogicException: Bối cảnh kết xuất trống, vì render() được gọi bên ngoài lệnh gọi renderRoot() hoặc renderPlain(). Sử dụng
thay vào đó, renderPlain()/renderRoot() hoặc #lazy_builder/#pre_render. Trong
Drupal\Core\Render\Renderer->doRender() (dòng 244 của
E:\www\myssc\html\core\lib\Drupal\Core\Render\Renderer.php).
[lỗi] Bối cảnh kết xuất trống, vì kết xuất() được gọi bên ngoài lệnh gọi renderRoot() hoặc renderPlain(). Sử dụng
thay vào đó, renderPlain()/renderRoot() hoặc #lazy_builder/#pre_render.
[lỗi] Cập nhật không thành công: ssc_custom_post_update_9001
Trong ProcessBase.php dòng 171:
Không thể giải mã đầu ra thành JSON: Lỗi cú pháp
[ERROR] [node] [2022-03-12T04:58:35] LogicException: Kết xuất ngữ cảnh
trống, vì render() được gọi bên ngoài renderRoot() hoặc
renderPlain() cuộc gọi. Sử dụng renderPlain()/renderRoot() hoặc
#lazy_builder/#pre_re tìm hiểu thay thế. trong Drupal\Core\Render\Renderer->doRender() (dòng 244 của
E:\www\myssc\html\core\lib\Drupal\C ore\Render\Renderer.php). | uid:
0 | yêu cầu-uri: http://default/ | tham khảo: | IP: 127.0.0.1 | liên kết:
{
"0": {
"ssc_custom": {
"9001": {
"#Huỷ bỏ": {
"thành công": sai,
"truy vấn": "Drupal\Core\Entity\EntityStorageException:
Ren der context trống, vì render() được gọi bên ngoài
lệnh gọi renderRoot() hoặc renderPlain(). Sử dụng lại nderPlain()/renderRoot()
hoặc #lazy_builder/#pre_render để thay thế. trong Drupal\Core\Ent
ity\Sql\SqlContentEntityStorage->save() (dòng 810 của E:\www\myssc\html\core\lib\Drupal\Core\Entity\Sql\SqlContentEntityStorage.php)."
}
}
},
"#Huỷ bỏ": [
"ssc_custom_post_update_9001"
]
},
"drush_batch_process_finished": true }
Tôi đã loại bỏ mã xuống mức tối thiểu:
sử dụng Drupal\Core\Entity\EntityStorageInterface;
sử dụng Drupal\Core\Entity\EntityTypeManagerInterface;
sử dụng Drupal\node\NodeInterface;
chức năng ssc_custom_post_update_9001(&$sandbox) {
/** @var \Drupal\node\NodeStorageInterface $node_storage */
$node_storage = \Drupal::entityTypeManager()->getStorage('node');
// Có bao nhiêu thực thể được xử lý mỗi đợt.
giới hạn $ = 5;
$node_ids = $node_storage->getQuery()
-> kiểm tra truy cập (SAI)
->điều kiện('loại', 'bài viết')
-> phạm vi (0, giới hạn $)
->thực thi();
// Tải các thực thể.
$nodes = $node_storage->loadMultiple($node_ids);
/** @var \Drupal\node\NodeInterface $node */
foreach ($nodes là $node) {
$node->setNewRevision();
$node->save();
}
$sandbox['#finished'] = 1;
}
Nếu tôi chạy trực tiếp cùng một mã (không phải từ drush updb) thì nó sẽ chạy tốt. Chạy từ menu quản trị "Chạy cập nhật"; nó cũng không thành công (vì vậy nó không phải là vấn đề về drush).
Nhận xét $node->save() và lỗi không xảy ra.