entityManager = $entity_manager; } /** * {@inheritdoc} */ public function convert($value, $definition, $name, array $defaults) { $entity_type_id = $this->getEntityTypeFromDefaults($definition, $name, $defaults); if ($storage = $this->entityManager->getStorage($entity_type_id)) { $entity = $storage->load($value); // If the entity type is translatable, ensure we return the proper // translation object for the current context. if ($entity instanceof EntityInterface && $entity instanceof TranslatableInterface) { $entity = $this->entityManager->getTranslationFromContext($entity, NULL, ['operation' => 'entity_upcast']); } return $entity; } } /** * {@inheritdoc} */ public function applies($definition, $name, Route $route) { if (!empty($definition['type']) && strpos($definition['type'], 'entity:') === 0) { $entity_type_id = substr($definition['type'], strlen('entity:')); if (strpos($definition['type'], '{') !== FALSE) { $entity_type_slug = substr($entity_type_id, 1, -1); return $name != $entity_type_slug && in_array($entity_type_slug, $route->compile()->getVariables(), TRUE); } return $this->entityManager->hasDefinition($entity_type_id); } return FALSE; } /** * Determines the entity type ID given a route definition and route defaults. * * @param mixed $definition * The parameter definition provided in the route options. * @param string $name * The name of the parameter. * @param array $defaults * The route defaults array. * * @return string * The entity type ID. * * @throws \Drupal\Core\ParamConverter\ParamNotConvertedException * Thrown when the dynamic entity type is not found in the route defaults. */ protected function getEntityTypeFromDefaults($definition, $name, array $defaults) { $entity_type_id = substr($definition['type'], strlen('entity:')); // If the entity type is dynamic, it will be pulled from the route defaults. if (strpos($entity_type_id, '{') === 0) { $entity_type_slug = substr($entity_type_id, 1, -1); if (!isset($defaults[$entity_type_slug])) { throw new ParamNotConvertedException(sprintf('The "%s" parameter was not converted because the "%s" parameter is missing', $name, $entity_type_slug)); } $entity_type_id = $defaults[$entity_type_slug]; } return $entity_type_id; } }