config/install/jsonapi.resource_info.yml | 1 - config/schema/jsonapi.schema.yml | 3 --- src/Configuration/ResourceConfig.php | 2 +- src/ParamConverter/EntityConverterField.php | 29 ++++++++-------------- .../Normalizer/DocumentRootNormalizerTest.php | 19 ++++++-------- 5 files changed, 18 insertions(+), 36 deletions(-) diff --git a/config/install/jsonapi.resource_info.yml b/config/install/jsonapi.resource_info.yml index b17ff5a..7b9cf68 100644 --- a/config/install/jsonapi.resource_info.yml +++ b/config/install/jsonapi.resource_info.yml @@ -1,2 +1 @@ prefix: api -id_field: uuid diff --git a/config/schema/jsonapi.schema.yml b/config/schema/jsonapi.schema.yml index e7ddc88..f58192d 100644 --- a/config/schema/jsonapi.schema.yml +++ b/config/schema/jsonapi.schema.yml @@ -4,6 +4,3 @@ jsonapi.resource_info: prefix: type: string label: 'Prefix' - id_field: - type: string - label: 'API field' diff --git a/src/Configuration/ResourceConfig.php b/src/Configuration/ResourceConfig.php index d3b9f55..4fe6fe5 100644 --- a/src/Configuration/ResourceConfig.php +++ b/src/Configuration/ResourceConfig.php @@ -156,7 +156,7 @@ class ResourceConfig implements ResourceConfigInterface { * {@inheritdoc} */ public function getIdKey() { - return $this->getGlobalConfig()->get('id_field'); + return 'uuid'; } /** diff --git a/src/ParamConverter/EntityConverterField.php b/src/ParamConverter/EntityConverterField.php index 966a299..dbaf3b1 100644 --- a/src/ParamConverter/EntityConverterField.php +++ b/src/ParamConverter/EntityConverterField.php @@ -5,15 +5,14 @@ namespace Drupal\jsonapi\ParamConverter; use Drupal\Core\Entity\EntityInterface; use Drupal\Core\ParamConverter\EntityConverter; use Drupal\Core\TypedData\TranslatableInterface; -use Symfony\Cmf\Component\Routing\RouteObjectInterface; use Symfony\Component\Routing\Route; /** - * Class EntityConverterUuid. + * Makes it possible to load an entity by UUID. * - * Make it possible to load an entity by uuid. + * @todo rename to EntityConverterUuidOrId * - * @package Drupal\jsonapi\ParamConverter + * @internal */ class EntityConverterField extends EntityConverter { @@ -21,18 +20,20 @@ class EntityConverterField extends EntityConverter { * {@inheritdoc} */ public function convert($value, $definition, $name, array $defaults) { - $route = $defaults[RouteObjectInterface::ROUTE_OBJECT]; $entity_type_id = $this->getEntityTypeFromDefaults($definition, $name, $defaults); if ($storage = $this->entityManager->getStorage($entity_type_id)) { - if (!$entities = $storage->loadByProperties([$route->getOption('_entity_load_key') => $value])) { + $entity_type_definition = $this->entityManager->getDefinition($entity_type_id); + $id_field_name = $entity_type_definition->hasKey('uuid') + ? $entity_type_definition->getKey('uuid') + : $entity_type_definition->getKey('id'); + if (!$entities = $storage->loadByProperties([$id_field_name => $value])) { return NULL; } - // Since this field is used as an alternate ID, it's assumed to be unique. $entity = reset($entities); // 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, array('operation' => 'entity_upcast')); + $entity = $this->entityManager->getTranslationFromContext($entity, NULL, ['operation' => 'entity_upcast']); } return $entity; } @@ -43,17 +44,7 @@ class EntityConverterField extends EntityConverter { * {@inheritdoc} */ public function applies($definition, $name, Route $route) { - // Only apply to JSON API routes. - if (!$route->getOption('_is_jsonapi')) { - return FALSE; - } - $config = \Drupal::config('jsonapi.resource_info'); - if (($key = $config->get('id_field')) && $key != 'id' && parent::applies($definition, $name, $route)) { - $route->addOptions(['_entity_load_key' => $config->get('id_field')]); - return TRUE; - } - return FALSE; + return $route->getOption('_is_jsonapi'); } - } diff --git a/tests/src/Kernel/Normalizer/DocumentRootNormalizerTest.php b/tests/src/Kernel/Normalizer/DocumentRootNormalizerTest.php index d5a8954..3c8dda1 100644 --- a/tests/src/Kernel/Normalizer/DocumentRootNormalizerTest.php +++ b/tests/src/Kernel/Normalizer/DocumentRootNormalizerTest.php @@ -165,7 +165,7 @@ class DocumentRootNormalizerTest extends JsonapiKernelTestBase { * @covers ::normalize */ public function testNormalize() { - list($request, $resource_config) = $this->generateProphecies('node', 'article', 'id'); + list($request, $resource_config) = $this->generateProphecies('node', 'article'); $query = $this->prophesize(ParameterBag::class); $query->get('fields')->willReturn([ 'node--article' => 'title,type,uid', @@ -191,7 +191,7 @@ class DocumentRootNormalizerTest extends JsonapiKernelTestBase { ] ); $this->assertSame($normalized['data']['attributes']['title'], 'dummy_title'); - $this->assertEquals($normalized['data']['id'], 1); + $this->assertEquals($normalized['data']['id'], $this->node->uuid()); $this->assertSame([ 'data' => [ 'type' => 'node_type--node_type', @@ -207,14 +207,14 @@ class DocumentRootNormalizerTest extends JsonapiKernelTestBase { $this->assertEquals([ 'data' => [ 'type' => 'user--user', - 'id' => $this->user->id(), + 'id' => $this->user->uuid(), ], 'links' => [ 'self' => 'dummy_entity_link', 'related' => 'dummy_entity_link', ], ], $normalized['data']['relationships']['uid']); - $this->assertEquals($this->user->id(), $normalized['included'][0]['id']); + $this->assertEquals($this->user->uuid(), $normalized['included'][0]['id']); $this->assertEquals('user--user', $normalized['included'][0]['type']); $this->assertEquals($this->user->label(), $normalized['included'][0]['attributes']['name']); $this->assertTrue(!isset($normalized['included'][0]['attributes']['created'])); @@ -230,7 +230,7 @@ class DocumentRootNormalizerTest extends JsonapiKernelTestBase { * @covers ::normalize */ public function testNormalizeRelated() { - list($request, $resource_config) = $this->generateProphecies('node', 'article', 'id', 'uid'); + list($request, $resource_config) = $this->generateProphecies('node', 'article', 'uid'); $query = $this->prophesize(ParameterBag::class); $query->get('fields')->willReturn([ 'user--user' => 'name,roles', @@ -525,13 +525,11 @@ class DocumentRootNormalizerTest extends JsonapiKernelTestBase { * The ID of the entity type. Ex: node. * @param string $bundle_id * The ID of the bundle. Ex: article. - * @param string $id_key - * The ID to load the entity by. Ex: {id|uuid}. * * @return array * A numeric array containing the request and the resource config mocks. */ - protected function generateProphecies($entity_type_id, $bundle_id, $id_key, $related_property = NULL) { + protected function generateProphecies($entity_type_id, $bundle_id, $related_property = NULL) { $request = $this->prophesize(Request::class); $route = $this->prophesize(Route::class); $path = sprintf('/%s/%s', $entity_type_id, $bundle_id); @@ -550,10 +548,7 @@ class DocumentRootNormalizerTest extends JsonapiKernelTestBase { ->willReturn(sprintf('%s--%s', $entity_type_id, $bundle_id)); $resource_config->getEntityTypeId()->willReturn($entity_type_id); $resource_config->getBundleId()->willReturn($bundle_id); - $resource_config->getIdKey()->willReturn($id_key); - \Drupal::configFactory()->getEditable('jsonapi.resource_info') - ->set('id_field', $id_key) - ->save(); + $resource_config->getIdKey()->willReturn('uuid'); /* @var \Drupal\Core\Entity\EntityTypeManagerInterface $entity_type_manager */ $entity_type_manager = $this->container->get('entity_type.manager');