From 371e762470efc1a8c68d5d7273964ba907e66365 Mon Sep 17 00:00:00 2001
From: webchick <drupal@webchick.net>
Date: Mon, 16 Jun 2014 09:31:16 -0700
Subject: [PATCH] Issue #2216533 by jhodgdon: Fill in topic/@defgroup docs for
 Entity API overview.

---
 .../Drupal/Core/Entity/ContentEntityBase.php  |  2 +
 .../Core/Entity/ContentEntityInterface.php    |  2 +
 .../Drupal/Core/Entity/EntityListBuilder.php  |  2 +
 core/lib/Drupal/Core/Entity/EntityType.php    |  2 +
 .../Drupal/Core/Entity/EntityViewBuilder.php  |  2 +
 .../src/ContentTranslationHandler.php         |  2 +
 core/modules/system/core.api.php              | 96 ++++++++++++++-----
 7 files changed, 83 insertions(+), 25 deletions(-)

diff --git a/core/lib/Drupal/Core/Entity/ContentEntityBase.php b/core/lib/Drupal/Core/Entity/ContentEntityBase.php
index 9716ccce983d..2ece2b51168c 100644
--- a/core/lib/Drupal/Core/Entity/ContentEntityBase.php
+++ b/core/lib/Drupal/Core/Entity/ContentEntityBase.php
@@ -16,6 +16,8 @@
 
 /**
  * Implements Entity Field API specific enhancements to the Entity class.
+ *
+ * @ingroup entity_api
  */
 abstract class ContentEntityBase extends Entity implements \IteratorAggregate, ContentEntityInterface {
 
diff --git a/core/lib/Drupal/Core/Entity/ContentEntityInterface.php b/core/lib/Drupal/Core/Entity/ContentEntityInterface.php
index 654fc5eb77ed..f07936c186d5 100644
--- a/core/lib/Drupal/Core/Entity/ContentEntityInterface.php
+++ b/core/lib/Drupal/Core/Entity/ContentEntityInterface.php
@@ -25,6 +25,8 @@
  *
  * @see \Drupal\Core\TypedData\TypedDataManager
  * @see \Drupal\Core\Field\FieldItemListInterface
+ *
+ * @ingroup entity_api
  */
 interface ContentEntityInterface extends EntityInterface, RevisionableInterface, TranslatableInterface, ComplexDataInterface {
 
diff --git a/core/lib/Drupal/Core/Entity/EntityListBuilder.php b/core/lib/Drupal/Core/Entity/EntityListBuilder.php
index ca5025c4f564..16a0849bf406 100644
--- a/core/lib/Drupal/Core/Entity/EntityListBuilder.php
+++ b/core/lib/Drupal/Core/Entity/EntityListBuilder.php
@@ -13,6 +13,8 @@
 
 /**
  * Defines a generic implementation to build a listing of entities.
+ *
+ * @ingroup entity_api
  */
 class EntityListBuilder extends EntityControllerBase implements EntityListBuilderInterface, EntityControllerInterface {
 
diff --git a/core/lib/Drupal/Core/Entity/EntityType.php b/core/lib/Drupal/Core/Entity/EntityType.php
index 438266533ca0..ac49238aeaa7 100644
--- a/core/lib/Drupal/Core/Entity/EntityType.php
+++ b/core/lib/Drupal/Core/Entity/EntityType.php
@@ -14,6 +14,8 @@
 
 /**
  * Provides an implementation of an entity type and its metadata.
+ *
+ * @ingroup entity_api
  */
 class EntityType implements EntityTypeInterface {
 
diff --git a/core/lib/Drupal/Core/Entity/EntityViewBuilder.php b/core/lib/Drupal/Core/Entity/EntityViewBuilder.php
index 23a4ebfb2139..99a10f420e07 100644
--- a/core/lib/Drupal/Core/Entity/EntityViewBuilder.php
+++ b/core/lib/Drupal/Core/Entity/EntityViewBuilder.php
@@ -22,6 +22,8 @@
 
 /**
  * Base class for entity view controllers.
+ *
+ * @ingroup entity_api
  */
 class EntityViewBuilder extends EntityControllerBase implements EntityControllerInterface, EntityViewBuilderInterface {
 
diff --git a/core/modules/content_translation/src/ContentTranslationHandler.php b/core/modules/content_translation/src/ContentTranslationHandler.php
index bd9a9c13467b..500ae4978ef9 100644
--- a/core/modules/content_translation/src/ContentTranslationHandler.php
+++ b/core/modules/content_translation/src/ContentTranslationHandler.php
@@ -14,6 +14,8 @@
 
 /**
  * Base class for content translation handlers.
+ *
+ * @ingroup entity_api
  */
 class ContentTranslationHandler implements ContentTranslationHandlerInterface {
 
diff --git a/core/modules/system/core.api.php b/core/modules/system/core.api.php
index 8c48e376937a..9b0f9ffbe255 100644
--- a/core/modules/system/core.api.php
+++ b/core/modules/system/core.api.php
@@ -268,53 +268,100 @@
  * @{
  * Describes how to define and manipulate content and configuration entities.
  *
- * @todo Add an overview here, describing what an entity is, bundles, entity
- *   types, etc. at an overview level. And link to more detailed documentation:
- *   https://drupal.org/developing/api/entity
- *
- * @section types Types of entities
- * Entities can be used to store content or configuration information. See the
+ * Entities, in Drupal, are objects that are used for persistent storage of
+ * content and configuration information. See the
  * @link architecture Drupal's architecture topic @endlink for an overview of
  * the different types of information, and the
  * @link config_api Configuration API topic @endlink for more about the
- * configuration API. Defining and manipulating content and configuration
- * entities is very similar, and this is described in the sections below.
+ * configuration API.
  *
- * @section define Defining an entity type
+ * Each entity is an instance of a particular "entity type". Some content entity
+ * types have sub-types, which are known as "bundles", while for other entity
+ * types, there is only a single bundle. For example, the Node content entity
+ * type, which is used for the main content pages in Drupal, has bundles that
+ * are known as "content types", while the User content type, which is used for
+ * user accounts, has only one bundle.
  *
- * @todo This section was written for Config entities. Add information about
- *   content entities to each item, and add additional items that are relevant
- *   to content entities, making sure to say they are not needed for config
- *   entities, such as view page controllers, etc.
+ * The sections below have more information about entities and the Entity API;
+ * for more detailed information, see https://drupal.org/developing/api/entity
  *
- * Here are the steps to follow to define a new entity type:
+ * @section define Defining an entity type
+ * Entity types are defined by modules, using Drupal's Plugin API (see the
+ * @link plugins Plugin API topic @endlink for more information about plugins
+ * in general). Here are the steps to follow to define a new entity type:
  * - Choose a unique machine name, or ID, for your entity type. This normally
  *   starts with (or is the same as) your module's machine name. It should be
  *   as short as possible, and may not exceed 32 characters.
  * - Define an interface for your entity's get/set methods, extending either
- *   \Drupal\Core\Config\Entity\ConfigEntityInterface or [content entity
- *   interface].
+ *   \Drupal\Core\Config\Entity\ConfigEntityInterface or
+ *   \Drupal\Core\Entity\ContentEntityInterface.
  * - Define a class for your entity, implementing your interface and extending
- *   either \Drupal\Core\Config\Entity\ConfigEntityBase or [content entity
- *   class] , with annotation for \@ConfigEntityType or [content entity
- *   annotation] in its documentation block.
+ *   either \Drupal\Core\Config\Entity\ConfigEntityBase or
+ *   \Drupal\Core\Entity\ContentEntityBase, with annotation for
+ *   \@ConfigEntityType or \@ContentEntityType in its documentation block.
  * - The 'id' annotation gives the entity type ID, and the 'label' annotation
- *   gives the human-readable name of the entity type.
+ *   gives the human-readable name of the entity type. If you are defining a
+ *   content entity type that uses bundles, the 'bundle_label' annotation gives
+ *   the human-readable name to use for a bundle of this entity type (for
+ *   example, "Content type" for the Node entity).
  * - The annotation will refer to several controller classes, which you will
  *   also need to define:
  *   - list_builder: Define a class that extends
- *     \Drupal\Core\Config\Entity\ConfigEntityListBuilder or [content entity
-       list builder], to provide an administrative overview for your entities.
+ *     \Drupal\Core\Config\Entity\ConfigEntityListBuilder (for configuration
+ *     entities) or \Drupal\Core\Entity\EntityListBuilder (for content
+ *     entities), to provide an administrative overview for your entities.
  *   - add and edit forms, or default form: Define a class (or two) that
  *     extend(s) \Drupal\Core\Entity\EntityForm to provide add and edit forms
  *     for your entities.
  *   - delete form: Define a class that extends
  *     \Drupal\Core\Entity\EntityConfirmFormBase to provide a delete
  *     confirmation form for your entities.
+ *   - view_buider: For content entities, define a class that extends
+ *     \Drupal\Core\Entity\EntityViewBuilder, to display a single entity.
+ *   - translation: For translatable content entities (if the 'translatable'
+ *     annotation has value TRUE), define a class that extends
+ *     \Drupal\content_translation\ContentTranslationHandler, to translate
+ *     the content. Configuration translation is handled automatically by the
+ *     Configuration Translation module, without the need of a controller class.
  *   - access: If your configuration entity has complex permissions, you might
  *     need an access controller, implementing
  *     \Drupal\Core\Entity\EntityAccessControllerInterface, but most entities
  *     can just use the 'admin_permission' annotation instead.
+ * - For content entities, the annotation will refer to a number of database
+ *   tables and their fields. These annotation properties, such as 'base_table',
+ *   'data_table', 'entity_keys', etc., are documented on
+ *   \Drupal\Core\Entity\EntityType. Your module will also need to set up its
+ *   database tables using hook_schema().
+ * - For content entities that are displayed on their own pages, the annotation
+ *   will refer to a 'uri_callback' function, which takes an object of the
+ *   entity interface you have defined as its parameter, and returns routing
+ *   information for the entity page; see node_uri() for an example. You will
+ *   also need to add a corresponding route to your module's routing.yml file;
+ *   see the node.view route in node.routing.yml for an example, and see the
+ *   @link menu Menu and routing @endlink topic for more information about
+ *   routing.
+ * - Define routing and links for the various URLs associated with the entity.
+ *   These go into the 'links' annotation, with the link type as the key, and
+ *   the route machine name (defined in your module's routing.yml file) as the
+ *   value. Typical link types are:
+ *   - canonical: Default link, either to view (if entities are viewed on their
+ *     own pages) or edit the entity.
+ *   - delete-form: Confirmation form to delete the entity.
+ *   - edit-form: Editing form.
+ *   - admin-form: Form for editing bundle or entity type settings.
+ *   - Other link types specific to your entity type can also be defined.
+ * - If your content entity has bundles, you will also need to define a second
+ *   plugin to handle the bundles. This plugin is itself a configuration entity
+ *   type, so follow the steps here to define it. The machine name ('id'
+ *   annotation) of this configuration entity class goes into the
+ *   'bundle_entity_type' annotation on the entity type class. For example, for
+ *   the Node entity, the bundle class is \Drupal\node\Entity\NodeType, whose
+ *   machine name is 'node_type'. This is the annotation value for
+ *  'bundle_entity_type' on the \Drupal\node\Entity\Node class.
+ * - Additional annotations can be seen on entity class examples such as
+ *   \Drupal\node\Entity\Node (content) and \Drupal\user\Entity\Role
+ *   (configuration). These annotations are documented on
+ *   \Drupal\Core\Entity\EntityType.
  *
  * @section load_query Loading and querying entities
  * To load entities, use the entity storage manager, which is a class
@@ -323,6 +370,8 @@
  * @code
  * $storage = \Drupal::entityManager()->getStorage('your_entity_type');
  * @endcode
+ * Here, 'your_entity_type' is the machine name of your entity type ('id'
+ * annotation on the entity class).
  *
  * To query to find entities to load, use an entity query, which is a class
  * implementing \Drupal\Core\Entity\Query\QueryInterface that you can retrieve
@@ -330,9 +379,6 @@
  * @code
  * $storage = \Drupal::entityQuery('your_entity_type');
  * @endcode
- *
- * @todo Add additional relevant classes and interfaces to this topic using
- *   ingroup.
  * @}
  */
 
-- 
GitLab