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