moduleHandler = $module_handler; } /** * {@inheritdoc} */ public function addBuilder(BreadcrumbBuilderInterface $builder, $priority) { $this->builders[$priority][] = $builder; // Force the builders to be re-sorted. $this->sortedBuilders = NULL; } /** * {@inheritdoc} */ public function applies(RouteMatchInterface $route_match) { return TRUE; } /** * {@inheritdoc} */ public function build(RouteMatchInterface $route_match) { $breadcrumb = new Breadcrumb(); $context = ['builder' => NULL]; // Call the build method of registered breadcrumb builders, // until one of them returns an array. foreach ($this->getSortedBuilders() as $builder) { if (!$builder->applies($route_match)) { // The builder does not apply, so we continue with the other builders. continue; } $breadcrumb = $builder->build($route_match); if ($breadcrumb instanceof Breadcrumb) { $context['builder'] = $builder; break; } else { throw new \UnexpectedValueException('Invalid breadcrumb returned by ' . get_class($builder) . '::build().'); } } // Allow modules to alter the breadcrumb. $this->moduleHandler->alter('system_breadcrumb', $breadcrumb, $route_match, $context); return $breadcrumb; } /** * Returns the sorted array of breadcrumb builders. * * @return \Drupal\Core\Breadcrumb\BreadcrumbBuilderInterface[] * An array of breadcrumb builder objects. */ protected function getSortedBuilders() { if (!isset($this->sortedBuilders)) { // Sort the builders according to priority. krsort($this->builders); // Merge nested builders from $this->builders into $this->sortedBuilders. $this->sortedBuilders = []; foreach ($this->builders as $builders) { $this->sortedBuilders = array_merge($this->sortedBuilders, $builders); } } return $this->sortedBuilders; } }