src/Plugin/Deriver/EntityDeriver.php | 62 +++++++++------------- .../resource_type/EntityJsonApiResourceType.php | 4 +- tests/modules/jsonapi_test/jsonapi_test.info.yml | 7 --- tests/modules/jsonapi_test/jsonapi_test.module | 16 ------ tests/src/Functional/JsonApiFunctionalTest.php | 12 ++--- 5 files changed, 30 insertions(+), 71 deletions(-) diff --git a/src/Plugin/Deriver/EntityDeriver.php b/src/Plugin/Deriver/EntityDeriver.php index a55546d..604e2d6 100644 --- a/src/Plugin/Deriver/EntityDeriver.php +++ b/src/Plugin/Deriver/EntityDeriver.php @@ -69,47 +69,35 @@ class EntityDeriver extends DeriverBase implements ContainerDeriverInterface { } $this->derivatives = []; + // Derive a JSON API Resource Type for every entity type + bundle + // combination. For entity types without bundles, the Entity API generates a + // default bundle that equals the entity type ID. Because contrib modules + // can alter to add bundle support or future entity provider module updates + // may add bundle support, we always include the bundle in the JSON API + // Resource Type, to guarantee backwards compatibility. $entity_types = $this->entityTypeManager->getDefinitions(); foreach ($entity_types as $entity_type_id => $entity_type) { - $plugin_definition = [ - 'serialization_class' => $entity_type->getClass(), - 'route_options' => [ - 'parameters' => [ - $entity_type_id => [ - 'type' => 'entity:' . $entity_type_id, - ], - ], - ], - 'route_path_part_for_individual_resource' => $entity_type_id, - ] + $base_plugin_definition; - - // First derive a JSON API Resource Type for this entity type (this covers - // all bundles). - $jsonapi_resource_type = sprintf('%s', $entity_type_id); - $this->derivatives[$jsonapi_resource_type] = [ - 'id' => $jsonapi_resource_type, - 'type' => $entity_type_id , - 'route_requirements' => [ - '_entity_type' => $entity_type_id, - ], - ] + $plugin_definition; - - // Now derive an additional JSON API Resource Type for every bundle that - // exists for this entity type. // @todo ensure new bundles are picked up immediately, see \Drupal\Core\Entity\EntityTypeBundleInfo::clearCachedBundles(). - if ($entity_type->hasKey('bundle')) { - $bundles = array_keys($this->bundleManager->getBundleInfo($entity_type_id)); - foreach ($bundles as $bundle) { - $jsonapi_resource_type = sprintf('%s--%s', $entity_type_id, $bundle); - $this->derivatives[$jsonapi_resource_type] = [ - 'id' => $jsonapi_resource_type, - 'type' => sprintf('%s--%s', $entity_type_id, $bundle), - 'route_requirements' => [ - '_entity_type' => $entity_type_id, - '_bundle' => $bundle, + $bundles = array_keys($this->bundleManager->getBundleInfo($entity_type_id)); + foreach ($bundles as $bundle) { + $jsonapi_resource_type = sprintf('%s--%s', $entity_type_id, $bundle); + $this->derivatives[$jsonapi_resource_type] = [ + 'id' => $jsonapi_resource_type, + 'type' => sprintf('%s--%s', $entity_type_id, $bundle), + 'serialization_class' => $entity_type->getClass(), + 'route_requirements' => [ + '_entity_type' => $entity_type_id, + '_bundle' => $bundle, + ], + 'route_options' => [ + 'parameters' => [ + $entity_type_id => [ + 'type' => 'entity:' . $entity_type_id, + ], ], - ] + $plugin_definition; - } + ], + 'route_path_part_for_individual_resource' => $entity_type_id, + ] + $base_plugin_definition; } } return $this->derivatives; diff --git a/src/Plugin/jsonapi/resource_type/EntityJsonApiResourceType.php b/src/Plugin/jsonapi/resource_type/EntityJsonApiResourceType.php index 1c67a4d..b5be5aa 100644 --- a/src/Plugin/jsonapi/resource_type/EntityJsonApiResourceType.php +++ b/src/Plugin/jsonapi/resource_type/EntityJsonApiResourceType.php @@ -77,9 +77,7 @@ class EntityJsonApiResourceType extends PluginBase implements JsonApiResourceTyp * @see \Drupal\jsonapi\Annotation\JsonApiResourceType::$type */ public static function getJsonApiResourceTypeForEntity(EntityInterface $entity) { - return $entity->getEntityType()->getBundleEntityType() === NULL - ? $entity->getEntityTypeId() - : sprintf('%s--%s', $entity->getEntityTypeId(), $entity->bundle()); + return sprintf('%s--%s', $entity->getEntityTypeId(), $entity->bundle()); } public static function getEntityTypeIdForJsonApiResourceType($type) { diff --git a/tests/modules/jsonapi_test/jsonapi_test.info.yml b/tests/modules/jsonapi_test/jsonapi_test.info.yml deleted file mode 100644 index 302490c..0000000 --- a/tests/modules/jsonapi_test/jsonapi_test.info.yml +++ /dev/null @@ -1,7 +0,0 @@ -name: JSON API Test -type: module -core: 8.x -package: Web services -hidden: true -dependencies: - - jsonapi diff --git a/tests/modules/jsonapi_test/jsonapi_test.module b/tests/modules/jsonapi_test/jsonapi_test.module deleted file mode 100644 index f8cda7f..0000000 --- a/tests/modules/jsonapi_test/jsonapi_test.module +++ /dev/null @@ -1,16 +0,0 @@ -getEntityTypeId() == 'menu' && $resource->getBundleId() == 'menu') { - $resource->disable(); - } - } -} diff --git a/tests/src/Functional/JsonApiFunctionalTest.php b/tests/src/Functional/JsonApiFunctionalTest.php index a2817db..0935fc0 100644 --- a/tests/src/Functional/JsonApiFunctionalTest.php +++ b/tests/src/Functional/JsonApiFunctionalTest.php @@ -31,7 +31,6 @@ class JsonApiFunctionalTest extends BrowserTestBase { public static $modules = [ 'basic_auth', 'jsonapi', - 'jsonapi_test', 'serialization', 'node', 'image', @@ -225,7 +224,7 @@ class JsonApiFunctionalTest extends BrowserTestBase { $single_output['data'][0]['links']['self'] ); $this->assertEquals( - 'taxonomy_vocabulary', + 'taxonomy_vocabulary--taxonomy_vocabulary', $single_output['included'][0]['type'] ); // 10. Single article with includes. @@ -236,7 +235,7 @@ class JsonApiFunctionalTest extends BrowserTestBase { $this->assertEquals('node--article', $single_output['data']['type']); $first_include = reset($single_output['included']); $this->assertEquals( - 'user', + 'user--user', $first_include['type'] ); $last_include = end($single_output['included']); @@ -249,11 +248,11 @@ class JsonApiFunctionalTest extends BrowserTestBase { 'query' => ['include' => 'uid'], ])); $this->assertSession()->statusCodeEquals(200); - $this->assertEquals('user', $single_output['data']['type']); + $this->assertEquals('user--user', $single_output['data']['type']); $this->assertArrayHasKey('related', $single_output['links']); $first_include = reset($single_output['included']); $this->assertEquals( - 'user', + 'user--user', $first_include['data']['type'] ); // 12. Collection with one access denied @@ -339,9 +338,6 @@ class JsonApiFunctionalTest extends BrowserTestBase { ])); $this->assertSession()->statusCodeEquals(200); $this->assertGreaterThanOrEqual(2, count($single_output['included'])); - // 17. Test filtering on the same field. - Json::decode($this->drupalGet('api/menu/menu')); - $this->assertSession()->statusCodeEquals(404); } /**