Mercurial > hg > isophonics-drupal-site
view core/lib/Drupal/Core/ParamConverter/EntityConverter.php @ 13:5fb285c0d0e3
Update Drupal core to 8.4.7 via Composer. Security update; I *think* we've
been lucky to get away with this so far, as we don't support self-registration
which seems to be used by the so-called "drupalgeddon 2" attack that 8.4.5
was vulnerable to.
author | Chris Cannam |
---|---|
date | Mon, 23 Apr 2018 09:33:26 +0100 |
parents | 4c8ae668cc8c |
children | 1fec387a4317 |
line wrap: on
line source
<?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; } }