diff --git a/jsonapi_extras.services.yml b/jsonapi_extras.services.yml index 571f48ab2939ea04d2b3ccdca739f7b40cd575e7..0a460ea99838553d98211a7b5472180b5dda99e4 100644 --- a/jsonapi_extras.services.yml +++ b/jsonapi_extras.services.yml @@ -42,4 +42,6 @@ services: jsonapi_extras.entity.to_jsonapi: class: Drupal\jsonapi_extras\EntityToJsonApi - arguments: ['@http_kernel'] + arguments: + - '@http_kernel' + - '@jsonapi.resource_type.repository' diff --git a/src/EntityToJsonApi.php b/src/EntityToJsonApi.php index bfa09a072f23bb2dc5bd0f08e469c834c1fb7e13..1b2bc4987c9ffb4136326b4199de9bd802ca2197 100644 --- a/src/EntityToJsonApi.php +++ b/src/EntityToJsonApi.php @@ -5,6 +5,7 @@ namespace Drupal\jsonapi_extras; use Drupal\Component\Serialization\Json; use Drupal\Core\Entity\EntityInterface; use Drupal\Core\Url; +use Drupal\jsonapi\ResourceType\ResourceTypeRepositoryInterface; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpKernel\HttpKernelInterface; @@ -22,14 +23,27 @@ class EntityToJsonApi { */ protected $httpKernel; + /** + * The JSON:API Resource Type Repository. + * + * @var \Drupal\jsonapi\ResourceType\ResourceTypeRepositoryInterface + */ + protected $resourceTypeRepository; + /** * EntityToJsonApi constructor. * * @param \Symfony\Component\HttpKernel\HttpKernelInterface $http_kernel * The HTTP kernel. + * @param \Drupal\jsonapi\ResourceType\ResourceTypeRepositoryInterface $resource_type_repository + * The resource type repository. */ - public function __construct(HttpKernelInterface $http_kernel) { + public function __construct( + HttpKernelInterface $http_kernel, + ResourceTypeRepositoryInterface $resource_type_repository + ) { $this->httpKernel = $http_kernel; + $this->resourceTypeRepository = $resource_type_repository; } /** @@ -42,10 +56,17 @@ class EntityToJsonApi { * * @return string * The raw JSON string of the requested resource. + * + * @throws \Exception */ public function serialize(EntityInterface $entity, array $includes = []) { - $route_name = sprintf('jsonapi.%s--%s.individual', $entity->getEntityTypeId(), $entity->bundle()); - $jsonapi_url = Url::fromRoute($route_name, ['entity' => $entity->uuid()])->toString(TRUE)->getGeneratedUrl(); + $resource_type_name = $this->resourceTypeRepository + ->get($entity->getEntityTypeId(), $entity->bundle()) + ->getTypeName(); + $route_name = sprintf('jsonapi.%s.individual', $resource_type_name); + $jsonapi_url = Url::fromRoute($route_name, ['entity' => $entity->uuid()]) + ->toString(TRUE) + ->getGeneratedUrl(); $query = []; if ($includes) { $query = ['include' => implode(',', $includes)]; @@ -65,6 +86,8 @@ class EntityToJsonApi { * * @return array * The JSON structure of the requested resource. + * + * @throws \Exception */ public function normalize(EntityInterface $entity, array $includes = []) { return Json::decode($this->serialize($entity, $includes));