Same name and namespace in other branches
  1. 8.9.x core/modules/jsonapi/src/Normalizer/EntityAccessDeniedHttpExceptionNormalizer.php \Drupal\jsonapi\Normalizer\EntityAccessDeniedHttpExceptionNormalizer
  2. 9 core/modules/jsonapi/src/Normalizer/EntityAccessDeniedHttpExceptionNormalizer.php \Drupal\jsonapi\Normalizer\EntityAccessDeniedHttpExceptionNormalizer

Normalizes an EntityAccessDeniedException.

Normalizes an EntityAccessDeniedException in compliance with the JSON:API specification. A source pointer is added to help client applications report which entity was access denied.

@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.

Hierarchy

Expanded class hierarchy of EntityAccessDeniedHttpExceptionNormalizer

See also

https://www.drupal.org/project/drupal/issues/3032787

jsonapi.api.php

http://jsonapi.org/format/#error-objects

1 string reference to 'EntityAccessDeniedHttpExceptionNormalizer'
jsonapi.services.yml in core/modules/jsonapi/jsonapi.services.yml
core/modules/jsonapi/jsonapi.services.yml
1 service uses EntityAccessDeniedHttpExceptionNormalizer
serializer.normalizer.entity_access_exception.jsonapi in core/modules/jsonapi/jsonapi.services.yml
Drupal\jsonapi\Normalizer\EntityAccessDeniedHttpExceptionNormalizer

File

core/modules/jsonapi/src/Normalizer/EntityAccessDeniedHttpExceptionNormalizer.php, line 24

Namespace

Drupal\jsonapi\Normalizer
View source
class EntityAccessDeniedHttpExceptionNormalizer extends HttpExceptionNormalizer {

  /**
   * {@inheritdoc}
   */
  protected function buildErrorObjects(HttpException $exception) {
    $errors = parent::buildErrorObjects($exception);
    if ($exception instanceof EntityAccessDeniedHttpException) {
      $error = $exception
        ->getError();

      /** @var \Drupal\Core\Entity\EntityInterface $entity */
      $entity = $error['entity'];
      $pointer = $error['pointer'];
      $reason = $error['reason'];
      $relationship_field = $error['relationship_field'] ?? NULL;
      if (isset($entity)) {
        $entity_type_id = $entity
          ->getEntityTypeId();
        $bundle = $entity
          ->bundle();

        /** @var \Drupal\jsonapi\ResourceType\ResourceType $resource_type */
        $resource_type = \Drupal::service('jsonapi.resource_type.repository')
          ->get($entity_type_id, $bundle);
        $resource_type_name = $resource_type
          ->getTypeName();
        $route_name = !is_null($relationship_field) ? "jsonapi.{$resource_type_name}.{$relationship_field}.related" : "jsonapi.{$resource_type_name}.individual";
        $url = Url::fromRoute($route_name, [
          'entity' => $entity
            ->uuid(),
        ]);
        $errors[0]['links']['via']['href'] = $url
          ->setAbsolute()
          ->toString(TRUE)
          ->getGeneratedUrl();
      }
      $errors[0]['source']['pointer'] = $pointer;
      if ($reason) {
        $errors[0]['detail'] = isset($errors[0]['detail']) ? $errors[0]['detail'] . ' ' . $reason : $reason;
      }
    }
    return $errors;
  }

  /**
   * {@inheritdoc}
   */
  public function getSupportedTypes(?string $format) : array {
    return [
      EntityAccessDeniedHttpException::class => TRUE,
    ];
  }

}

Members