diff -u b/core/lib/Drupal/Core/Breadcrumb/Breadcrumb.php b/core/lib/Drupal/Core/Breadcrumb/Breadcrumb.php --- b/core/lib/Drupal/Core/Breadcrumb/Breadcrumb.php +++ b/core/lib/Drupal/Core/Breadcrumb/Breadcrumb.php @@ -8,6 +8,7 @@ namespace Drupal\Core\Breadcrumb; use Drupal\Core\Cache\CacheableMetadata; +use Drupal\Core\Link; /** * Used to return generated breadcrumbs, along with associated cacheability metadata. @@ -27,7 +28,7 @@ * @return \Drupal\Core\Link[] */ public function getLinks() { - return $this->links ; + return $this->links; } /** @@ -44,4 +45,18 @@ return $this; } + + /** + * Add a single link to the end of the breadcrumb. + * + * @param \Drupal\Core\Link $link + * The link added to the breadcrumb. + * + * @return $this + */ + public function addLink(Link $link) { + $this->links[] = $link; + + return $this; + } } diff -u b/core/lib/Drupal/Core/Breadcrumb/BreadcrumbBuilderInterface.php b/core/lib/Drupal/Core/Breadcrumb/BreadcrumbBuilderInterface.php --- b/core/lib/Drupal/Core/Breadcrumb/BreadcrumbBuilderInterface.php +++ b/core/lib/Drupal/Core/Breadcrumb/BreadcrumbBuilderInterface.php @@ -32,7 +32,7 @@ * @param \Drupal\Core\Routing\RouteMatchInterface $route_match * The current route match. * - * @return mixed[] + * @return \Drupal\Core\Breadcrumb\Breadcrumb * A breadcrumb. */ public function build(RouteMatchInterface $route_match); diff -u b/core/lib/Drupal/Core/Breadcrumb/BreadcrumbManager.php b/core/lib/Drupal/Core/Breadcrumb/BreadcrumbManager.php --- b/core/lib/Drupal/Core/Breadcrumb/BreadcrumbManager.php +++ b/core/lib/Drupal/Core/Breadcrumb/BreadcrumbManager.php @@ -78,6 +78,7 @@ public function build(RouteMatchInterface $route_match) { $build = [ 'links' => [], + 'contexts' => [], ]; $context = array('builder' => NULL); // Call the build method of registered breadcrumb builders, @@ -91,7 +92,8 @@ $breadcrumb = $builder->build($route_match); if ($breadcrumb instanceof Breadcrumb) { - // The builder returned an array of breadcrumb links. + // The builder returned a Breadcrumb object which has to be added to an + // array so it could be altered. $build['contexts'] = $breadcrumb->getCacheContexts(); $build['links'] = $breadcrumb->getLinks(); $context['builder'] = $builder; @@ -103,8 +105,13 @@ } // Allow modules to alter the breadcrumb. $this->moduleHandler->alter('system_breadcrumb', $build['links'], $route_match, $context); - // Fall back to an empty breadcrumb. - return $build; + + // Create new Breadcrumb object. + $breadcrumb = new Breadcrumb(); + $breadcrumb->setLinks($build['links']); + $breadcrumb->setCacheContexts($build['contexts']); + + return $breadcrumb; } /** diff -u b/core/modules/forum/src/Breadcrumb/ForumNodeBreadcrumbBuilder.php b/core/modules/forum/src/Breadcrumb/ForumNodeBreadcrumbBuilder.php --- b/core/modules/forum/src/Breadcrumb/ForumNodeBreadcrumbBuilder.php +++ b/core/modules/forum/src/Breadcrumb/ForumNodeBreadcrumbBuilder.php @@ -7,7 +7,6 @@ namespace Drupal\forum\Breadcrumb; -use Drupal\Core\Breadcrumb\Breadcrumb; use Drupal\Core\Link; use Drupal\Core\Routing\RouteMatchInterface; @@ -29,23 +28,22 @@ * {@inheritdoc} */ public function build(RouteMatchInterface $route_match) { - $breadcrumb = new Breadcrumb(); + $breadcrumb= parent::build($route_match); $breadcrumb->setCacheContexts(['route']); - $links = parent::build($route_match); $parents = $this->forumManager->getParents($route_match->getParameter('node')->forum_tid); if ($parents) { $parents = array_reverse($parents); foreach ($parents as $parent) { - $links[] = Link::createFromRoute($parent->label(), 'forum.page', + $breadcrumb->addLink(Link::createFromRoute($parent->label(), 'forum.page', array( 'taxonomy_term' => $parent->id(), ) - ); + )); } } - return $breadcrumb->setLinks($links); + return $breadcrumb; } } diff -u b/core/modules/system/tests/src/Unit/Breadcrumbs/PathBasedBreadcrumbBuilderTest.php b/core/modules/system/tests/src/Unit/Breadcrumbs/PathBasedBreadcrumbBuilderTest.php --- b/core/modules/system/tests/src/Unit/Breadcrumbs/PathBasedBreadcrumbBuilderTest.php +++ b/core/modules/system/tests/src/Unit/Breadcrumbs/PathBasedBreadcrumbBuilderTest.php @@ -131,7 +131,7 @@ ->will($this->returnValue('/')); $links = $this->builder->build($this->getMock('Drupal\Core\Routing\RouteMatchInterface')); - $this->assertEquals(array(), $links); + $this->assertEquals([], $links->getLinks()); } /** @@ -145,7 +145,7 @@ ->will($this->returnValue('/example')); $links = $this->builder->build($this->getMock('Drupal\Core\Routing\RouteMatchInterface')); - $this->assertEquals(array(0 => new Link('Home', new Url(''))), $links); + $this->assertEquals([0 => new Link('Home', new Url(''))], $links->getLinks()); } /** @@ -177,7 +177,7 @@ $this->setupAccessManagerToAllow(); $links = $this->builder->build($this->getMock('Drupal\Core\Routing\RouteMatchInterface')); - $this->assertEquals(array(0 => new Link('Home', new Url('')), 1 => new Link('Example', new Url('example'))), $links); + $this->assertEquals([0 => new Link('Home', new Url('')), 1 => new Link('Example', new Url('example'))], $links->getLinks()); } /** @@ -217,11 +217,11 @@ $this->setupAccessManagerToAllow(); $links = $this->builder->build($this->getMock('Drupal\Core\Routing\RouteMatchInterface')); - $this->assertEquals(array( + $this->assertEquals([ new Link('Home', new Url('')), new Link('Example', new Url('example')), new Link('Bar', new Url('example_bar')), - ), $links); + ], $links->getLinks()); } /** @@ -245,7 +245,7 @@ $links = $this->builder->build($this->getMock('Drupal\Core\Routing\RouteMatchInterface')); // No path matched, though at least the frontpage is displayed. - $this->assertEquals(array(0 => new Link('Home', new Url(''))), $links); + $this->assertEquals([0 => new Link('Home', new Url(''))], $links->getLinks()); } /** @@ -286,7 +286,7 @@ $links = $this->builder->build($this->getMock('Drupal\Core\Routing\RouteMatchInterface')); // No path matched, though at least the frontpage is displayed. - $this->assertEquals(array(0 => new Link('Home', new Url(''))), $links); + $this->assertEquals([0 => new Link('Home', new Url(''))], $links->getLinks()); } /** @@ -331,7 +331,7 @@ ->will($this->returnValue('Admin')); $links = $this->builder->build($this->getMock('Drupal\Core\Routing\RouteMatchInterface')); - $this->assertEquals(array(0 => new Link('Home', new Url('')), 1 => new Link('Admin', new Url('user_page'))), $links); + $this->assertEquals([0 => new Link('Home', new Url('')), 1 => new Link('Admin', new Url('user_page'))], $links->getLinks()); } /** diff -u b/core/tests/Drupal/Tests/Core/Breadcrumb/BreadcrumbManagerTest.php b/core/tests/Drupal/Tests/Core/Breadcrumb/BreadcrumbManagerTest.php --- b/core/tests/Drupal/Tests/Core/Breadcrumb/BreadcrumbManagerTest.php +++ b/core/tests/Drupal/Tests/Core/Breadcrumb/BreadcrumbManagerTest.php @@ -52,7 +52,7 @@ */ public function testBuildWithoutBuilder() { $result = $this->breadcrumbManager->build($this->getMock('Drupal\Core\Routing\RouteMatchInterface')); - $this->assertEquals(array(), $result['links']); + $this->assertEquals(array(), $result->getLinks()); } /** @@ -79,7 +79,7 @@ $this->breadcrumbManager->addBuilder($builder, 0); $result = $this->breadcrumbManager->build($route_match); - $this->assertEquals($links, $result['links']); + $this->assertEquals($links, $result->getLinks()); } /** @@ -112,7 +112,7 @@ $this->breadcrumbManager->addBuilder($builder2, 10); $result = $this->breadcrumbManager->build($route_match); - $this->assertEquals($links2, $result['links']); + $this->assertEquals($links2, $result->getLinks()); } /** @@ -146,7 +146,7 @@ $this->breadcrumbManager->addBuilder($builder2, 0); $result = $this->breadcrumbManager->build($route_match); - $this->assertEquals($links2, $result['links']); + $this->assertEquals($links2, $result->getLinks()); } /** only in patch2: unchanged: --- a/core/modules/forum/src/Breadcrumb/ForumListingBreadcrumbBuilder.php +++ b/core/modules/forum/src/Breadcrumb/ForumListingBreadcrumbBuilder.php @@ -7,6 +7,7 @@ namespace Drupal\forum\Breadcrumb; +use Drupal\Core\Breadcrumb\Breadcrumb; use Drupal\Core\Link; use Drupal\Core\Routing\RouteMatchInterface; @@ -34,9 +35,9 @@ public function build(RouteMatchInterface $route_match) { if ($parents) { foreach (array_reverse($parents) as $parent) { if ($parent->id() != $term_id) { - $breadcrumb[] = Link::createFromRoute($parent->label(), 'forum.page', array( + $breadcrumb->addLink(Link::createFromRoute($parent->label(), 'forum.page', array( 'taxonomy_term' => $parent->id(), - )); + ))); } } } only in patch2: unchanged: --- a/core/modules/forum/tests/src/Unit/Breadcrumb/ForumListingBreadcrumbBuilderTest.php +++ b/core/modules/forum/tests/src/Unit/Breadcrumb/ForumListingBreadcrumbBuilderTest.php @@ -197,7 +197,7 @@ public function testBuild() { Link::createFromRoute('Fora_is_the_plural_of_forum', 'forum.index'), Link::createFromRoute('Something', 'forum.page', array('taxonomy_term' => 1)), ); - $this->assertEquals($expected1, $breadcrumb_builder->build($route_match)); + $this->assertEquals($expected1, $breadcrumb_builder->build($route_match)->getLinks()); // Second test. $expected2 = array( @@ -206,7 +206,7 @@ public function testBuild() { Link::createFromRoute('Something else', 'forum.page', array('taxonomy_term' => 2)), Link::createFromRoute('Something', 'forum.page', array('taxonomy_term' => 1)), ); - $this->assertEquals($expected2, $breadcrumb_builder->build($route_match)); + $this->assertEquals($expected2, $breadcrumb_builder->build($route_match)->getLinks()); } } only in patch2: unchanged: --- a/core/modules/forum/tests/src/Unit/Breadcrumb/ForumNodeBreadcrumbBuilderTest.php +++ b/core/modules/forum/tests/src/Unit/Breadcrumb/ForumNodeBreadcrumbBuilderTest.php @@ -9,7 +9,6 @@ use Drupal\Core\Link; use Drupal\Tests\UnitTestCase; -use Symfony\Cmf\Component\Routing\RouteObjectInterface; /** * @coversDefaultClass \Drupal\forum\Breadcrumb\ForumNodeBreadcrumbBuilder @@ -162,6 +161,8 @@ public function testBuild() { array('taxonomy_vocabulary', $vocab_storage), ))); + + $config_factory = $this->getConfigFactoryStub( array( 'forum.settings' => array( @@ -203,7 +204,7 @@ public function testBuild() { Link::createFromRoute('Forums', 'forum.index'), Link::createFromRoute('Something', 'forum.page', array('taxonomy_term' => 1)), ); - $this->assertEquals($expected1, $breadcrumb_builder->build($route_match)); + $this->assertEquals($expected1, $breadcrumb_builder->build($route_match)->getLinks()); // Second test. $expected2 = array( @@ -212,7 +213,7 @@ public function testBuild() { Link::createFromRoute('Something else', 'forum.page', array('taxonomy_term' => 2)), Link::createFromRoute('Something', 'forum.page', array('taxonomy_term' => 1)), ); - $this->assertEquals($expected2, $breadcrumb_builder->build($route_match)); + $this->assertEquals($expected2, $breadcrumb_builder->build($route_match)->getLinks()); } }