Это недопустимый вариант использования для drupal_flush_all_caches(). Эта функция предназначена для измененного или нового кода. Для контента вы должны использовать теги кеша.
В редких случаях, когда невозможно добавить правильные теги кеша ко всем массивам рендеринга, вы можете сделать тег недействительным. оказанный
, который добавляется по умолчанию, даже если теги кеша не указаны:
\Drupal\Core\Cache\Cache::invalidateTags(['рендеринг']);
Кстати, операции с сущностями обрабатываются в транзакциях, поэтому параллельный запрос страницы может не увидеть изменения, пока они не будут зафиксированы в базе данных. В этом случае очистка кеша (в любой форме) не помогает.
Изменить: добавление примера для последнего комментария.
Хорошим решением будет обработчик очереди. Он работает в фоновом режиме, без этого вам придется ждать ответа панели администратора после сохранения узла.
Пример:
В хук добавьте элемент очереди с идентификатором сущности:
Медиа::постсохранить()
\Drupal::queue('media_entity_thumbnail')->createItem(['id' => $translation->id()]);
Что добавляет элемент очереди для этого плагина обработки очереди:
/modules/media/src/Plugin/QueueWorker/ThumbnailDownloader.php
<?php
пространство имен Drupal\media\Plugin\QueueWorker;
используйте Drupal\Core\Entity\EntityTypeManagerInterface;
используйте Drupal\Core\Plugin\ContainerFactoryPluginInterface;
используйте Drupal\Core\Queue\QueueWorkerBase;
используйте Symfony\Component\DependencyInjection\ContainerInterface;
/**
* Обработка очереди элементов мультимедиа для получения их миниатюр.
*
* @QueueWorker(
* id = "media_entity_thumbnail",
* title = @Translation("Загрузчик эскизов"),
* cron = {"время" = 60}
* )
*/
class ThumbnailDownloader расширяет QueueWorkerBase, реализует ContainerFactoryPluginInterface {
/**
* Служба диспетчера типов сущностей.
*
* @var \Drupal\Core\Entity\EntityTypeManagerInterface
*/
защищенный $entityTypeManager;
/**
* Создает новый экземпляр класса.
*
* @param массив $configuration
* Массив конфигурации, содержащий информацию об экземпляре плагина.
* @param строка $plugin_id
* plugin_id для экземпляра плагина.
* @param смешанный $plugin_definition
* Определение реализации плагина.
* @param \Drupal\Core\Entity\EntityTypeManagerInterface $entity_type_manager
* Служба менеджера типа объекта.
*/
публичная функция __construct (массив $configuration, $plugin_id, $plugin_definition, EntityTypeManagerInterface $entity_type_manager) {
parent::__construct($configuration, $plugin_id, $plugin_definition);
$this->entityTypeManager = $entity_type_manager;
}
/**
* {@inheritdoc}
*/
общедоступная статическая функция create(ContainerInterface $container, массив $configuration, $plugin_id, $plugin_definition) {
вернуть новую статику(
$ конфигурация,
$plugin_id,
$plugin_definition,
$container->получить('entity_type.manager')
);
}
/**
* {@inheritdoc}
*/
публичная функция processItem($data) {
/** @var \Drupal\media\Entity\Media $media */
if ($media = $this->entityTypeManager->getStorage('media')->load($data['id'])) {
$media->updateQueuedThumbnail();
$медиа->сохранить();
}
}
}
По умолчанию cron запускается только каждые 3 часа. Если вам нужен статический HTML в более короткие сроки, запустите задачу cron (которая также запускает очереди) за пределами веб-сайта. Видеть https://www.drupal.org/docs/user_guide/en/security-cron.html