Mercurial > hg > isophonics-drupal-site
diff core/lib/Drupal/Core/ParamConverter/EntityConverter.php @ 0:4c8ae668cc8c
Initial import (non-working)
author | Chris Cannam |
---|---|
date | Wed, 29 Nov 2017 16:09:58 +0000 |
parents | |
children | 1fec387a4317 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/core/lib/Drupal/Core/ParamConverter/EntityConverter.php Wed Nov 29 16:09:58 2017 +0000 @@ -0,0 +1,119 @@ +<?php + +namespace Drupal\Core\ParamConverter; + +use Drupal\Core\Entity\EntityInterface; +use Drupal\Core\Entity\EntityManagerInterface; +use Drupal\Core\TypedData\TranslatableInterface; +use Symfony\Component\Routing\Route; + +/** + * Parameter converter for upcasting entity IDs to full objects. + * + * This is useful in cases where the dynamic elements of the path can't be + * auto-determined; for example, if your path refers to multiple of the same + * type of entity ("example/{node1}/foo/{node2}") or if the path can act on any + * entity type ("example/{entity_type}/{entity}/foo"). + * + * In order to use it you should specify some additional options in your route: + * @code + * example.route: + * path: foo/{example} + * options: + * parameters: + * example: + * type: entity:node + * @endcode + * + * If you want to have the entity type itself dynamic in the url you can + * specify it like the following: + * @code + * example.route: + * path: foo/{entity_type}/{example} + * options: + * parameters: + * example: + * type: entity:{entity_type} + * @endcode + */ +class EntityConverter implements ParamConverterInterface { + + /** + * Entity manager which performs the upcasting in the end. + * + * @var \Drupal\Core\Entity\EntityManagerInterface + */ + protected $entityManager; + + /** + * Constructs a new EntityConverter. + * + * @param \Drupal\Core\Entity\EntityManagerInterface $entity_manager + * The entity manager. + */ + public function __construct(EntityManagerInterface $entity_manager) { + $this->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; + } + +}