Вывести изображение программно в Drupal 8 достаточно просто — возможно, даже проще, чем в Drupal 7. Рассмотрим полный процесс: от загрузки файла до построения render array с применением стилей изображений и кэш-зависимостями.
Шаг 1: Загрузка файла
Загружаем файл по его ID через систему сущностей:
$file = File::load(1);
Шаг 2: Подготовка переменных и валидация
Создаём массив переменных с именем стиля и URI файла. Затем используем сервис image.factory для проверки валидности изображения и получения его размеров:
$variables = array(
'style_name' => 'thumbnail',
'uri' => $file->getFileUri(),
);
// Сервис image.factory проверит валидность изображения
$image = \\Drupal::service('image.factory')->get($file->getFileUri());
if ($image->isValid()) {
$variables['width'] = $image->getWidth();
$variables['height'] = $image->getHeight();
} else {
$variables['width'] = $variables['height'] = NULL;
}
Шаг 3: Построение render array
Строим render array с использованием темы image_style:
$logo_render_array = [ '#theme' => 'image_style', '#width' => $variables['width'], '#height' => $variables['height'], '#style_name' => $variables['style_name'], '#uri' => $variables['uri'], ];
Шаг 4: Кэш-зависимости
Drupal 8 предоставляет гранулярное управление кэшем. Добавляем объект файла как кэш-зависимость — это обеспечит сброс кэша при обновлении файла:
// Добавляем объект файла к зависимостям кэша.
// Это очистит наш кэш, когда сущность обновится.
$renderer = \\Drupal::service('renderer');
$renderer->addCacheableDependency($logo_render_array, $file);