Существует два типа блоков, и метод их рендеринга немного отличается:
Блоки контента
Блоки контента - это блоки, которые вы создаете в интерфейсе. Они очень похожи на настраиваемые узлами структуры данных, с полями и т. Д. Если вы хотите визуализировать одну из них, вы можете делать то, что вы обычно делаете с сущностями, загружать их и визуализировать их с помощью построителя представлений:
$bid = ??? // Get the block id through config, SQL or some other means
$block = \Drupal\block_content\Entity\BlockContent::load($bid);
$render = \Drupal::entityTypeManager()->
getViewBuilder('block_content')->view($block);
return $render;
Блоки плагинов
Блоки также могут быть плагинами, определенными в различных модулях. Примером может служить блок с хлебными крошками. Если вы хотите отрендерить их, вам нужно будет использовать менеджер блочных плагинов.
$block_manager = \Drupal::service('plugin.manager.block');
// You can hard code configuration or you load from settings.
$config = [];
$plugin_block = $block_manager->createInstance('system_breadcrumb_block', $config);
// Some blocks might implement access check.
$access_result = $plugin_block->access(\Drupal::currentUser());
// Return empty render array if user doesn't have access.
// $access_result can be boolean or an AccessResult class
if (is_object($access_result) && $access_result->isForbidden() || is_bool($access_result) && !$access_result) {
// You might need to add some cache tags/contexts.
return [];
}
$render = $plugin_block->build();
// In some cases, you need to add the cache tags/context depending on
// the block implemention. As it's possible to add the cache tags and
// contexts in the render method and in ::getCacheTags and
// ::getCacheContexts methods.
return $render;
Конфигурация сущностей
Для этих двух типов общими являются блоки, которые, как только вы вставите их в область, создадут объект конфигурации, который имеет все настройки для блока. В некоторых случаях будет более полезной обработка конфигурационных объектов. Поскольку один и тот же блок может быть размещен в нескольких регионах с различной конфигурацией, он может стать более сложным, если использовать объекты конфигурации блока. Приятно то, что вам может потребоваться визуализировать блок с определенной конфигурацией, но плохо то, что идентификаторы конфигурации могут измениться, связавшись с интерфейсом, поэтому код может не работать после того, как пользователь сможет использовать интерфейс блока.
$block = \Drupal\block\Entity\Block::load('config.id');
$render = \Drupal::entityTypeManager()
->getViewBuilder('block')
->view($block);
return $render;