diff --git a/core/lib/Drupal/Core/Entity/Enhancer/EntityRouteEnhancer.php b/core/lib/Drupal/Core/Entity/Enhancer/EntityRouteEnhancer.php index 371e136..d8e5cd5 100644 --- a/core/lib/Drupal/Core/Entity/Enhancer/EntityRouteEnhancer.php +++ b/core/lib/Drupal/Core/Entity/Enhancer/EntityRouteEnhancer.php @@ -9,6 +9,7 @@ use Symfony\Component\HttpFoundation\Request; use Symfony\Cmf\Component\Routing\Enhancer\RouteEnhancerInterface; +use Symfony\Cmf\Component\Routing\RouteObjectInterface; use Drupal\Core\ContentNegotiation; /** @@ -52,7 +53,21 @@ public function enhance(array $defaults, Request $request) { $defaults['_content'] = '\Drupal\Core\Entity\Controller\EntityViewController::view'; list($entity_type, $view_mode) = explode('.', $defaults['_entity_view']); // Set by reference so that we get the upcast value. - $defaults['entity'] = &$defaults[$entity_type]; + if (!empty($defaults[$entity_type])) { + $defaults['entity'] = &$defaults[$entity_type]; + } + else { + // The entity is not keyed by its entity_type. Attempt to find it + // using a converter. + $route = $request->attributes->get(RouteObjectInterface::ROUTE_OBJECT); + $options = $route->getOptions(); + if (isset($options['converters'])) { + $flipped = array_flip($options['converters']); + if (isset($flipped[$entity_type]) && !empty($defaults[$flipped[$entity_type]])) { + $defaults['entity'] = $defaults[$flipped[$entity_type]]; + } + } + } $defaults['view_mode'] = $view_mode; unset($defaults['_entity_view']); } diff --git a/core/tests/Drupal/Tests/Core/Entity/Controller/EntityViewControllerTest.php b/core/tests/Drupal/Tests/Core/Entity/Controller/EntityViewControllerTest.php new file mode 100644 index 0000000..cfa1e29 --- /dev/null +++ b/core/tests/Drupal/Tests/Core/Entity/Controller/EntityViewControllerTest.php @@ -0,0 +1,62 @@ + 'Entity route enhancer test', + 'description' => 'Tests the entity route enhancer.', + 'group' => 'Entity' + ); + } + + /** + * Tests the enhancer method. + * + * @see \Drupal\Core\Entity\Controller\EntityViewController::view() + */ + public function testView() { + + // Mock a render controller. + $render_controller = $this->getMockBuilder('Drupal\entity_test\EntityTestRenderController') + ->disableOriginalConstructor() + ->getMock(); + $render_controller->expects($this->any()) + ->method('view') + ->will($this->returnValue('Output from rendering the entity')); + + // Mock an entity manager. + $entity_manager = $this->getMockBuilder('Drupal\Core\Entity\EntityManager') + ->disableOriginalConstructor() + ->getMock(); + $entity_manager->expects($this->any()) + ->method('getRenderController') + ->will($this->returnValue($render_controller)); + + // Mock an 'entity_test_render' entity. + $entity = $this->getMockBuilder('Drupal\entity_test\Plugin\Core\Entity\EntityTestRender') + ->disableOriginalConstructor() + ->getMock(); + + // Initialize the controller to test. + $controller = new EntityViewController($entity_manager); + + // Test the view method. + $this->assertEquals($controller->view($entity, 'full'), 'Output from rendering the entity'); + } +} diff --git a/core/tests/Drupal/Tests/Core/Entity/Enhancer/EntityRouteEnhancerTest.php b/core/tests/Drupal/Tests/Core/Entity/Enhancer/EntityRouteEnhancerTest.php index dc82cfd..00bae1c 100644 --- a/core/tests/Drupal/Tests/Core/Entity/Enhancer/EntityRouteEnhancerTest.php +++ b/core/tests/Drupal/Tests/Core/Entity/Enhancer/EntityRouteEnhancerTest.php @@ -10,6 +10,7 @@ use Drupal\Core\ContentNegotiation; use Drupal\Core\Entity\Enhancer\EntityRouteEnhancer; use Drupal\Tests\UnitTestCase; +use Symfony\Cmf\Component\Routing\RouteObjectInterface; use Symfony\Component\HttpFoundation\Request; /** @@ -73,6 +74,30 @@ public function testEnhancer() { $this->assertEquals($defaults['entity'], 'Mock entity'); $this->assertEquals($defaults['view_mode'], 'default'); $this->assertFalse(isset($defaults['_entity_view'])); + + // Set _entity_view and ensure that the entity view controller is set using + // a converter. + $defaults = array(); + $defaults['_entity_view'] = 'entity_test.default'; + $defaults['foo'] = 'Mock entity'; + // Add a converter. + $options['converters']['foo'] = 'entity_test'; + // Set the route. + $route = $this->getMockBuilder('Symfony\Component\Routing\Route') + ->disableOriginalConstructor() + ->getMock(); + + $route->expects($this->any()) + ->method('getOptions') + ->will($this->returnValue($options)); + + $request->attributes->set(RouteObjectInterface::ROUTE_OBJECT, $route); + $defaults = $route_enhancer->enhance($defaults, $request); + $this->assertEquals('controller.page:content', $defaults['_controller']); + $this->assertEquals('\Drupal\Core\Entity\Controller\EntityViewController::view', $defaults['_content'], 'The entity view controller was not set.'); + $this->assertEquals($defaults['entity'], 'Mock entity'); + $this->assertEquals($defaults['view_mode'], 'default'); + $this->assertFalse(isset($defaults['_entity_view'])); } }