entityTypeManager = $entity_type_manager; $this->configFactory = $config_factory; $this->requestStack = $request_stack; $this->titleResolver = $title_resolver; } /** * Builds the render array of a given region. * * @param string $region * The region to build. * @param string $theme * (optional) The name of the theme to load the region. If it is not * provided then default theme will be used. * * @return array * A render array to display the region content. */ public function build(string $region, string $theme = NULL): array { $blocks = $this->entityTypeManager->getStorage('block')->loadByProperties([ 'region' => $region, 'theme' => $theme ?: $this->configFactory->get('system.theme')->get('default'), ]); $view_builder = $this->entityTypeManager->getViewBuilder('block'); $build = []; $cache_metadata = new CacheableMetadata(); /* @var $blocks \Drupal\block\BlockInterface[] */ foreach ($blocks as $id => $block) { $access = $block->access('view', NULL, TRUE); $cache_metadata = $cache_metadata->merge(CacheableMetadata::createFromObject($access)); if ($access->isAllowed()) { $block_plugin = $block->getPlugin(); if ($block_plugin instanceof TitleBlockPluginInterface) { $request = $this->requestStack->getCurrentRequest(); if ($route = $request->attributes->get(RouteObjectInterface::ROUTE_OBJECT)) { $block_plugin->setTitle($this->titleResolver->getTitle($request, $route)); } } $build[$id] = $view_builder->view($block); } } if ($build) { $build['#region'] = $region; $build['#theme_wrappers'] = ['region']; $cache_metadata->applyTo($build); } return $build; } }