Existem dois tipos de blocos, e o método para renderizar os dois é um pouco diferente:
Blocos de Conteúdo
Blocos de conteúdo são blocos criados na interface. Eles são muito parecidos com as estruturas de dados configuráveis dos nós, com campos etc. Se você deseja renderizar uma delas, pode fazer o que normalmente faria com entidades, carregá-las e renderizá-las com o construtor de vistas:
$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;
Blocos de plug-in
Os blocos também podem ser plugins, definidos em vários módulos. Um exemplo pode ser o bloco de trilha de navegação. Se você deseja renderizá-las, precisará usar o gerenciador de plug-ins de bloco.
$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;
Entidades de configuração
Os blocos compartilhados para os dois tipos são: depois que você os inserir em uma região, você criará uma entidade de configuração que possui todas as configurações para o bloco. Em alguns casos, será mais útil lidar com entidades de configuração. Como o mesmo bloco pode ser colocado em várias regiões com e com configurações diferentes, pode ficar mais complicado usando as entidades de configuração do bloco. O bom é que você pode renderizar um bloco com uma configuração específica, o ruim é que os IDs de configuração podem mudar ao mexer na interface, portanto, o código pode não funcionar depois de permitir que os usuários usem a interface do bloco.
$block = \Drupal\block\Entity\Block::load('config.id');
$render = \Drupal::entityTypeManager()
->getViewBuilder('block')
->view($block);
return $render;