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 \Drupal\Core\Breadcrumb\Breadcrumb + * @return mixed[] * 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 @@ -7,7 +7,6 @@ namespace Drupal\Core\Breadcrumb; -use \Drupal\Core\Breadcrumb\Breadcrumb; use Drupal\Component\Utility\SafeMarkup; use Drupal\Core\Extension\ModuleHandlerInterface; use Drupal\Core\Routing\RouteMatchInterface; @@ -77,7 +76,9 @@ * {@inheritdoc} */ public function build(RouteMatchInterface $route_match) { - $breadcrumb = array(); + $build = [ + 'links' => [], + ]; $context = array('builder' => NULL); // Call the build method of registered breadcrumb builders, // until one of them returns an array. @@ -87,12 +88,12 @@ continue; } - $build = $builder->build($route_match); + $breadcrumb = $builder->build($route_match); - if ($build instanceof Breadcrumb) { + if ($breadcrumb instanceof Breadcrumb) { // The builder returned an array of breadcrumb links. - $breadcrumb['contexts'] = $build->getCacheContexts(); - $breadcrumb['links'] = $build->getLinks(); + $build['contexts'] = $breadcrumb->getCacheContexts(); + $build['links'] = $breadcrumb->getLinks(); $context['builder'] = $builder; break; } @@ -101,9 +102,9 @@ } } // Allow modules to alter the breadcrumb. - $this->moduleHandler->alter('system_breadcrumb', $breadcrumb['links'], $route_match, $context); + $this->moduleHandler->alter('system_breadcrumb', $build['links'], $route_match, $context); // Fall back to an empty breadcrumb. - return $breadcrumb; + return $build; } /** only in patch2: unchanged: --- a/core/modules/forum/tests/src/Unit/Breadcrumb/ForumBreadcrumbBuilderBaseTest.php +++ b/core/modules/forum/tests/src/Unit/Breadcrumb/ForumBreadcrumbBuilderBaseTest.php @@ -128,7 +128,7 @@ public function testBuild() { ); // And finally, the test. - $this->assertEquals($expected, $breadcrumb_builder->build($route_match)); + $this->assertEquals($expected, $breadcrumb_builder->build($route_match)->getLinks()); } } only in patch2: unchanged: --- a/core/tests/Drupal/Tests/Core/Breadcrumb/BreadcrumbManagerTest.php +++ b/core/tests/Drupal/Tests/Core/Breadcrumb/BreadcrumbManagerTest.php @@ -7,6 +7,7 @@ namespace Drupal\Tests\Core\Breadcrumb; +use Drupal\Core\Breadcrumb\Breadcrumb; use Drupal\Core\Breadcrumb\BreadcrumbManager; use Drupal\Tests\UnitTestCase; @@ -17,6 +18,13 @@ class BreadcrumbManagerTest extends UnitTestCase { /** + * The breadcrumb object. + * + * @var \Drupal\Core\Breadcrumb\Breadcrumb + */ + protected $breadcrumb; + + /** * The tested breadcrumb manager. * * @var \Drupal\Core\Breadcrumb\BreadcrumbManager @@ -36,6 +44,7 @@ class BreadcrumbManagerTest extends UnitTestCase { protected function setUp() { $this->moduleHandler = $this->getMock('Drupal\Core\Extension\ModuleHandlerInterface'); $this->breadcrumbManager = new BreadcrumbManager($this->moduleHandler); + $this->breadcrumb = new Breadcrumb(); } /** @@ -43,7 +52,7 @@ protected function setUp() { */ public function testBuildWithoutBuilder() { $result = $this->breadcrumbManager->build($this->getMock('Drupal\Core\Routing\RouteMatchInterface')); - $this->assertEquals(array(), $result); + $this->assertEquals(array(), $result['links']); } /** @@ -51,7 +60,8 @@ public function testBuildWithoutBuilder() { */ public function testBuildWithSingleBuilder() { $builder = $this->getMock('Drupal\Core\Breadcrumb\BreadcrumbBuilderInterface'); - $breadcrumb = array('Test'); + $links = array('Test'); + $this->breadcrumb->setLinks($links); $builder->expects($this->once()) ->method('applies') @@ -59,17 +69,17 @@ public function testBuildWithSingleBuilder() { $builder->expects($this->once()) ->method('build') - ->will($this->returnValue($breadcrumb)); + ->willReturn($this->breadcrumb); $route_match = $this->getMock('Drupal\Core\Routing\RouteMatchInterface'); $this->moduleHandler->expects($this->once()) ->method('alter') - ->with('system_breadcrumb', $breadcrumb, $route_match, array('builder' => $builder)); + ->with('system_breadcrumb', $links, $route_match, array('builder' => $builder)); $this->breadcrumbManager->addBuilder($builder, 0); $result = $this->breadcrumbManager->build($route_match); - $this->assertEquals($breadcrumb, $result); + $this->assertEquals($links, $result['links']); } /** @@ -83,25 +93,26 @@ public function testBuildWithMultipleApplyingBuilders() { ->method('build'); $builder2 = $this->getMock('Drupal\Core\Breadcrumb\BreadcrumbBuilderInterface'); - $breadcrumb2 = array('Test2'); + $links2 = array('Test2'); + $this->breadcrumb->setLinks($links2); $builder2->expects($this->once()) ->method('applies') ->will($this->returnValue(TRUE)); $builder2->expects($this->once()) ->method('build') - ->will($this->returnValue($breadcrumb2)); + ->willReturn($this->breadcrumb); $route_match = $this->getMock('Drupal\Core\Routing\RouteMatchInterface'); $this->moduleHandler->expects($this->once()) ->method('alter') - ->with('system_breadcrumb', $breadcrumb2, $route_match, array('builder' => $builder2)); + ->with('system_breadcrumb', $links2, $route_match, array('builder' => $builder2)); $this->breadcrumbManager->addBuilder($builder1, 0); $this->breadcrumbManager->addBuilder($builder2, 10); $result = $this->breadcrumbManager->build($route_match); - $this->assertEquals($breadcrumb2, $result); + $this->assertEquals($links2, $result['links']); } /** @@ -116,25 +127,26 @@ public function testBuildWithOneNotApplyingBuilders() { ->method('build'); $builder2 = $this->getMock('Drupal\Core\Breadcrumb\BreadcrumbBuilderInterface'); - $breadcrumb2 = array('Test2'); + $links2 = array('Test2'); + $this->breadcrumb->setLinks($links2); $builder2->expects($this->once()) ->method('applies') ->will($this->returnValue(TRUE)); $builder2->expects($this->once()) ->method('build') - ->will($this->returnValue($breadcrumb2)); + ->willReturn($this->breadcrumb); $route_match = $this->getMock('Drupal\Core\Routing\RouteMatchInterface'); $this->moduleHandler->expects($this->once()) ->method('alter') - ->with('system_breadcrumb', $breadcrumb2, $route_match, array('builder' => $builder2)); + ->with('system_breadcrumb', $links2, $route_match, array('builder' => $builder2)); $this->breadcrumbManager->addBuilder($builder1, 10); $this->breadcrumbManager->addBuilder($builder2, 0); $result = $this->breadcrumbManager->build($route_match); - $this->assertEquals($breadcrumb2, $result); + $this->assertEquals($links2, $result['links']); } /**