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