Mercurial > hg > isophonics-drupal-site
diff core/modules/jsonapi/src/Revisions/NegotiatorBase.php @ 18:af1871eacc83
Update to Drupal core 8.7.1
author | Chris Cannam |
---|---|
date | Thu, 09 May 2019 15:33:08 +0100 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/core/modules/jsonapi/src/Revisions/NegotiatorBase.php Thu May 09 15:33:08 2019 +0100 @@ -0,0 +1,106 @@ +<?php + +namespace Drupal\jsonapi\Revisions; + +use Drupal\Core\Entity\EntityInterface; +use Drupal\Core\Entity\EntityTypeManagerInterface; + +/** + * Base implementation for version negotiators. + * + * @internal JSON:API maintains no PHP API since its API is the HTTP API. This + * class may change at any time and this will break any dependencies on it. + * + * @see https://www.drupal.org/project/jsonapi/issues/3032787 + * @see jsonapi.api.php + */ +abstract class NegotiatorBase implements VersionNegotiatorInterface { + + /** + * The entity type manager to load the revision. + * + * @var \Drupal\Core\Entity\EntityTypeManagerInterface + */ + protected $entityTypeManager; + + /** + * Constructs a version negotiator instance. + * + * @param \Drupal\Core\Entity\EntityTypeManagerInterface $entity_type_manager + * The entity type manager. + */ + public function __construct(EntityTypeManagerInterface $entity_type_manager) { + $this->entityTypeManager = $entity_type_manager; + } + + /** + * Gets the revision ID. + * + * @param \Drupal\Core\Entity\EntityInterface $entity + * The entity. + * @param string $version_argument + * A value used to derive a revision ID for the given entity. + * + * @return int + * The revision ID. + * + * @throws \Drupal\jsonapi\Revisions\VersionNotFoundException + * When the revision does not exist. + * @throws \Drupal\jsonapi\Revisions\InvalidVersionIdentifierException + * When the revision ID is not valid. + */ + abstract protected function getRevisionId(EntityInterface $entity, $version_argument); + + /** + * {@inheritdoc} + */ + public function getRevision(EntityInterface $entity, $version_argument) { + return $this->loadRevision($entity, $this->getRevisionId($entity, $version_argument)); + } + + /** + * Loads an entity revision. + * + * @param \Drupal\Core\Entity\EntityInterface $entity + * The entity for which to load a revision. + * @param int $revision_id + * The revision ID to be loaded. + * + * @return \Drupal\Core\Entity\EntityInterface|null + * The revision or NULL if the revision does not exists. + * + * @throws \Drupal\Component\Plugin\Exception\PluginNotFoundException + * Thrown if the entity type doesn't exist. + * @throws \Drupal\Component\Plugin\Exception\InvalidPluginDefinitionException + * Thrown if the storage handler couldn't be loaded. + */ + protected function loadRevision(EntityInterface $entity, $revision_id) { + $storage = $this->entityTypeManager->getStorage($entity->getEntityTypeId()); + $revision = static::ensureVersionExists($storage->loadRevision($revision_id)); + if ($revision->id() !== $entity->id()) { + throw new VersionNotFoundException(sprintf('The requested resource does not have a version with ID %s.', $revision_id)); + } + return $revision; + } + + /** + * Helper method that ensures that a version exists. + * + * @param int|\Drupal\Core\Entity\EntityInterface $revision + * A revision ID, or NULL if one was not found. + * + * @return int|\Drupal\Core\Entity\EntityInterface + * A revision or revision ID, if one was found. + * + * @throws \Drupal\jsonapi\Revisions\VersionNotFoundException + * Thrown if the given value is NULL, meaning the requested version was not + * found. + */ + protected static function ensureVersionExists($revision) { + if (is_null($revision)) { + throw new VersionNotFoundException(); + } + return $revision; + } + +}