У меня есть простая функция hook_post_update, которая завершается со следующей ошибкой:
[уведомление] Начато обновление: ssc_custom_post_update_9001
[ошибка] LogicException: Контекст рендеринга пуст, потому что render() был вызван вне вызова renderRoot() или renderPlain(). Использовать
вместо этого renderPlain()/renderRoot() или #lazy_builder/#pre_render. в
Drupal\Core\Render\Renderer->doRender() (строка 244
E:\www\myssc\html\core\lib\Drupal\Core\Render\Renderer.php).
[ошибка] Контекст рендеринга пуст, потому что render() был вызван вне вызова renderRoot() или renderPlain(). Использовать
вместо этого renderPlain()/renderRoot() или #lazy_builder/#pre_render.
[ошибка] Ошибка обновления: ssc_custom_post_update_9001
В строке ProcessBase.php 171:
Невозможно декодировать вывод в JSON: синтаксическая ошибка
[ОШИБКА] [узел] [2022-03-12T04:58:35] LogicException: визуализация контекста
пуст, потому что функция render() была вызвана вне функции renderRoot() или
Вызов рендерПлайн(). Используйте renderPlain()/renderRoot() или
Вместо этого #lazy_builder/#pre_re nder. в Drupal\Core\Render\Renderer->doRender() (строка 244
E:\www\myssc\html\core\lib\Drupal\Core\Render\Renderer.php). | ИД:
0 | запрос-uri: http://default/ | см.: | IP-адрес: 127.0.0.1 | соединять:
{
"0": {
"ssc_custom": {
"9001": {
"#прервать": {
"успех": ложь,
"query": "Drupal\Core\Entity\EntityStorageException:
Контекст рендеринга пуст, потому что render() был вызван вне
вызов renderRoot() или renderPlain(). Используйте renderPlain()/renderRoot()
или #lazy_builder/#pre_render. в друпал\кор\энт
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 ($nodes как $node) {
$узел->setNewRevision();
$узел->сохранить();
}
$песочница['#finished'] = 1;
}
Если я запускаю тот же код напрямую (не из drush updb), он работает нормально. Запуск из админ-меню «Выполнить обновления»; он также терпит неудачу (так что это не проблема drush).
Комментируя $node->save(), ошибка не возникает.