Lab / Drupal 8

Drupal 8 Программный вывод изображения со стилями

Иногда бывает необходимость вывести изображение прямо в коде, без рендеринга текущего материала. На самом деле это достаточно просто, возможно, даже проще, чем в Drupal 7. Во-первых, вы должны вывести файл. В Drupal 8 всё основано на сущностях, в том числе и файлы. Вывод файлов происходит так же как и у нод. В следующем примере мы будем загружат файл по его ID. $file = File::load(1); Если ваш файл существует, вы можете начать с создания визуализации массива для изображения. В данном примере рендерим как обычный стиль изображения, например "thumbnail".
$variables = array(
 'style_name' => 'thumbnail',
 'uri' => $file->getFileUri(),
);

// The image.factory service will check if our image is valid.
$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;
}

$logo_render_array = [
 '#theme' => 'image_style',
 '#width' => $variables['width'],
 '#height' => $variables['height'],
 '#style_name' => $variables['style_name'],
 '#uri' => $variables['uri'],
];
Несмотря на то, что приведённый выше пример прекрасно справляется с задачей, в Drupal 8 есть дополнительные плюшки для более тонкой настройки. Вместо кэширования всех результатов Drupal 8 предоставляет возможность кэширования только необходимого. Мы добавим наш объект файла в кэш визуализации массива. Таким образом, когда файл обновляется, кэш рендеринга массива очищается.
// Добавляем объект файла к зависимостям кэша.
// Это очистит наш кэш, когда сущность обновится.
$renderer = \Drupal::service('renderer');
$renderer->addCacheableDependency($logo_render_array, $file);
Теперь ваш отрендереный массив готов к использованию в кастомных блоках, страницах, да и вообще везде, где Drupal 8 использует визуализации массива. Здесь можно посмотреть полный пример (реализованно как плагин блока): gist.github.com/jerbob92/8b432928ca60cc7fd3da Здесь пример пагина загрузки по URI: gist.github.com/jerbob92/c9617da94452a597c36e Вот пример для визуализации файла с адаптивным изображением: gist.github.com/jerbob92/dda50c579d2fcb31cecd