class BreadcrumbManager

Same name in other branches
  1. 9 core/lib/Drupal/Core/Breadcrumb/BreadcrumbManager.php \Drupal\Core\Breadcrumb\BreadcrumbManager
  2. 8.9.x core/lib/Drupal/Core/Breadcrumb/BreadcrumbManager.php \Drupal\Core\Breadcrumb\BreadcrumbManager
  3. 10 core/lib/Drupal/Core/Breadcrumb/BreadcrumbManager.php \Drupal\Core\Breadcrumb\BreadcrumbManager

Provides a breadcrumb manager.

Can be assigned any number of BreadcrumbBuilderInterface objects by calling the addBuilder() method. When build() is called it iterates over the objects in priority order and uses the first one that returns TRUE from BreadcrumbBuilderInterface::applies() to build the breadcrumbs.

Hierarchy

Expanded class hierarchy of BreadcrumbManager

See also

\Drupal\Core\DependencyInjection\Compiler\RegisterBreadcrumbBuilderPass

1 file declares its use of BreadcrumbManager
BreadcrumbManagerTest.php in core/tests/Drupal/Tests/Core/Breadcrumb/BreadcrumbManagerTest.php

File

core/lib/Drupal/Core/Breadcrumb/BreadcrumbManager.php, line 19

Namespace

Drupal\Core\Breadcrumb
View source
class BreadcrumbManager implements ChainBreadcrumbBuilderInterface {
    
    /**
     * The module handler to invoke the alter hook.
     *
     * @var \Drupal\Core\Extension\ModuleHandlerInterface
     */
    protected $moduleHandler;
    
    /**
     * Holds arrays of breadcrumb builders, keyed by priority.
     *
     * @var array
     */
    protected $builders = [];
    
    /**
     * Holds the array of breadcrumb builders sorted by priority.
     *
     * Set to NULL if the array needs to be re-calculated.
     *
     * @var \Drupal\Core\Breadcrumb\BreadcrumbBuilderInterface[]|null
     */
    protected $sortedBuilders;
    
    /**
     * Constructs a \Drupal\Core\Breadcrumb\BreadcrumbManager object.
     *
     * @param \Drupal\Core\Extension\ModuleHandlerInterface $module_handler
     *   The module handler.
     */
    public function __construct(ModuleHandlerInterface $module_handler) {
        $this->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, ?CacheableMetadata $cacheable_metadata = NULL) {
        return TRUE;
    }
    
    /**
     * {@inheritdoc}
     */
    public function build(RouteMatchInterface $route_match) {
        $cacheable_metadata = new CacheableMetadata();
        $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, $cacheable_metadata)) {
                // 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;
                $breadcrumb->addCacheableDependency($cacheable_metadata);
                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 = array_merge(...$this->builders);
        }
        return $this->sortedBuilders;
    }

}

Members

Title Sort descending Modifiers Object type Summary Overriden Title
BreadcrumbManager::$builders protected property Holds arrays of breadcrumb builders, keyed by priority.
BreadcrumbManager::$moduleHandler protected property The module handler to invoke the alter hook.
BreadcrumbManager::$sortedBuilders protected property Holds the array of breadcrumb builders sorted by priority.
BreadcrumbManager::addBuilder public function Adds another breadcrumb builder. Overrides ChainBreadcrumbBuilderInterface::addBuilder
BreadcrumbManager::applies public function Whether this breadcrumb builder should be used to build the breadcrumb. Overrides BreadcrumbBuilderInterface::applies
BreadcrumbManager::build public function Builds the breadcrumb. Overrides BreadcrumbBuilderInterface::build
BreadcrumbManager::getSortedBuilders protected function Returns the sorted array of breadcrumb builders.
BreadcrumbManager::__construct public function Constructs a \Drupal\Core\Breadcrumb\BreadcrumbManager object.

Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.