Існує два типи блоків, і метод їх надання трохи відрізняється:
Блоки вмісту
Блоки вмісту - це блоки, які ви створюєте в інтерфейсі. Вони дуже схожі на вузли, що налаштовуються структурами даних, з полями тощо. Якщо ви хочете вивести одне з них, ви можете робити те, що зазвичай робите з сутностями, завантажуйте їх і надайте їх конструктору перегляду:
$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;