diff --git a/core/core.services.yml b/core/core.services.yml index bcf528b..f210151 100644 --- a/core/core.services.yml +++ b/core/core.services.yml @@ -986,7 +986,7 @@ services: class: Drupal\Core\EventSubscriber\EntityRouteAlterSubscriber tags: - { name: event_subscriber } - arguments: ['@resolver_manager.entity'] + arguments: ['@resolver_manager.entity', '@entity_type.manager'] ajax_response.subscriber: class: Drupal\Core\EventSubscriber\AjaxResponseSubscriber arguments: ['@ajax_response.attachments_processor'] diff --git a/core/lib/Drupal/Core/EventSubscriber/EntityRouteAlterSubscriber.php b/core/lib/Drupal/Core/EventSubscriber/EntityRouteAlterSubscriber.php index 50e13ff..721eb7c 100644 --- a/core/lib/Drupal/Core/EventSubscriber/EntityRouteAlterSubscriber.php +++ b/core/lib/Drupal/Core/EventSubscriber/EntityRouteAlterSubscriber.php @@ -3,6 +3,7 @@ namespace Drupal\Core\EventSubscriber; use Drupal\Core\Entity\EntityResolverManager; +use Drupal\Core\Entity\EntityTypeManagerInterface; use Symfony\Component\EventDispatcher\EventSubscriberInterface; use Drupal\Core\Routing\RoutingEvents; use Drupal\Core\Routing\RouteBuildEvent; @@ -28,13 +29,21 @@ class EntityRouteAlterSubscriber implements EventSubscriberInterface { protected $resolverManager; /** + * The entity type manager. + * + * @var \Drupal\Core\Entity\EntityTypeManagerInterface + */ + protected $entityTypeManager; + + /** * Constructs an EntityRouteAlterSubscriber instance. * * @param \Drupal\Core\Entity\EntityResolverManager $entity_resolver_manager * The entity resolver manager. */ - public function __construct(EntityResolverManager $entity_resolver_manager) { + public function __construct(EntityResolverManager $entity_resolver_manager, EntityTypeManagerInterface $entity_type_manager) { $this->resolverManager = $entity_resolver_manager; + $this->entityTypeManager = $entity_type_manager; } /** @@ -57,12 +66,17 @@ public function onRoutingRouteAlterSetType(RouteBuildEvent $event) { */ public function onRoutingRouteAlterSetLatestRevision(RouteBuildEvent $event) { foreach ($event->getRouteCollection() as $route) { - if (!$route->getDefault('_entity_form')) { + if (!$entity_form = $route->getDefault('_entity_form')) { continue; } + // Only set the flag on entity types which are revisionable. + list($entity_type) = explode('.', $entity_form); + if (!$this->entityTypeManager->getDefinition($entity_type)->isRevisionable()) { + return; + } $parameters = $route->getOption('parameters') ?: []; foreach ($parameters as &$parameter) { - if (!isset($parameter['load_latest_revision'])) { + if ($parameter['type'] === 'entity:' . $entity_type && !isset($parameter['load_latest_revision'])) { $parameter['load_latest_revision'] = TRUE; } } diff --git a/core/lib/Drupal/Core/ParamConverter/EntityConverter.php b/core/lib/Drupal/Core/ParamConverter/EntityConverter.php index 3a9d417..bfd7cd9 100644 --- a/core/lib/Drupal/Core/ParamConverter/EntityConverter.php +++ b/core/lib/Drupal/Core/ParamConverter/EntityConverter.php @@ -68,7 +68,7 @@ public function convert($value, $definition, $name, array $defaults) { // If the entity type is revisionable and the parameter has the // "load_latest_revision" flag load the latest revision. if (!empty($definition['load_latest_revision']) && $entity_definition->isRevisionable()) { - // @todo, replace this query with a standardised way of getting the + // @todo, replace this query with a standardized way of getting the // latest revision in https://www.drupal.org/node/2784201. $entity_revisions = $storage ->getQuery() diff --git a/core/tests/Drupal/Tests/Core/EventSubscriber/EntityRouteAlterSubscriberTest.php b/core/tests/Drupal/Tests/Core/EventSubscriber/EntityRouteAlterSubscriberTest.php index b85fde5..f53912f 100644 --- a/core/tests/Drupal/Tests/Core/EventSubscriber/EntityRouteAlterSubscriberTest.php +++ b/core/tests/Drupal/Tests/Core/EventSubscriber/EntityRouteAlterSubscriberTest.php @@ -3,6 +3,8 @@ namespace Drupal\Tests\Core\EventSubscriber; use Drupal\Core\Entity\EntityResolverManager; +use Drupal\Core\Entity\EntityTypeInterface; +use Drupal\Core\Entity\EntityTypeManagerInterface; use Drupal\Core\EventSubscriber\EntityRouteAlterSubscriber; use Drupal\Core\Routing\RouteBuildEvent; use Drupal\Tests\UnitTestCase; @@ -23,11 +25,20 @@ class EntityRouteAlterSubscriberTest extends UnitTestCase { protected $subscriber; /** + * @var \Drupal\Core\Entity\EntityTypeInterface|\Prophecy\Prophecy\ObjectProphecy + */ + protected $entityDefinition; + + /** * {@inheritdoc} */ protected function setUp() { parent::setUp(); - $this->subscriber = new EntityRouteAlterSubscriber($this->prophesize(EntityResolverManager::class)->reveal()); + + $this->entityDefinition = $this->prophesize(EntityTypeInterface::class); + $entity_type_manager = $this->prophesize(EntityTypeManagerInterface::class); + $entity_type_manager->getDefinition('entity_test')->willReturn($this->entityDefinition->reveal()); + $this->subscriber = new EntityRouteAlterSubscriber($this->prophesize(EntityResolverManager::class)->reveal(), $entity_type_manager->reveal()); } /** @@ -35,7 +46,8 @@ protected function setUp() { * * @dataProvider latestRevisionAlterTestCases */ - public function testLatestRevisionAlter($defaults, $parameters, $expected_parameters = FALSE) { + public function testLatestRevisionAlter($defaults, $parameters, $expected_parameters = FALSE, $entity_type_revisionable = TRUE) { + $this->entityDefinition->isRevisionable()->willReturn($entity_type_revisionable); $route = new Route('/foo', $defaults, [], [ 'parameters' => $parameters, ]); @@ -95,7 +107,6 @@ public function latestRevisionAlterTestCases() { ], 'node' => [ 'type' => 'entity:node', - 'load_latest_revision' => TRUE, ], ], ], @@ -110,6 +121,18 @@ public function latestRevisionAlterTestCases() { ], ], ], + 'Non-revisionable entity type will not change' => [ + [ + '_entity_form' => 'entity_test.edit' + ], + [ + 'entity_test' => [ + 'type' => 'entity:entity_test', + ], + ], + FALSE, + FALSE, + ], 'Overriden load_latest_revision flag does not change with multiple parameters' => [ [ '_entity_form' => 'entity_test.edit'