class EntityQueryEntities in GraphQL 8.3
Retrieve the entity result set of an entity query.
Plugin annotation
@GraphQLField(
id = "entity_query_entities",
secure = true,
name = "entities",
type = "[Entity]",
parents = {"EntityQueryResult"},
arguments = {
"language" = "LanguageId"
},
contextual_arguments = {"language"}
)
Hierarchy
- class \Drupal\Component\Plugin\PluginBase implements DerivativeInspectionInterface, PluginInspectionInterface
- class \Drupal\graphql\Plugin\GraphQL\Fields\FieldPluginBase implements FieldPluginInterface uses ArgumentAwarePluginTrait, CacheablePluginTrait, DeprecatablePluginTrait, DescribablePluginTrait, TypedPluginTrait
- class \Drupal\graphql_core\Plugin\GraphQL\Fields\EntityQuery\EntityQueryEntities implements ContainerFactoryPluginInterface uses DependencySerializationTrait
- class \Drupal\graphql\Plugin\GraphQL\Fields\FieldPluginBase implements FieldPluginInterface uses ArgumentAwarePluginTrait, CacheablePluginTrait, DeprecatablePluginTrait, DescribablePluginTrait, TypedPluginTrait
Expanded class hierarchy of EntityQueryEntities
File
- modules/
graphql_core/ src/ Plugin/ GraphQL/ Fields/ EntityQuery/ EntityQueryEntities.php, line 35
Namespace
Drupal\graphql_core\Plugin\GraphQL\Fields\EntityQueryView source
class EntityQueryEntities extends FieldPluginBase implements ContainerFactoryPluginInterface {
use DependencySerializationTrait;
/**
* The entity buffer service.
*
* @var \Drupal\graphql\GraphQL\Buffers\EntityBuffer
*/
protected $entityBuffer;
/**
* The entity type manager service.
*
* @var \Drupal\Core\Entity\EntityTypeManagerInterface
*/
protected $entityTypeManager;
/**
* The entity repository service.
*
* @var \Drupal\Core\Entity\EntityRepositoryInterface
*/
protected $entityRepository;
/**
* {@inheritdoc}
*/
public static function create(ContainerInterface $container, array $configuration, $pluginId, $pluginDefinition) {
return new static($configuration, $pluginId, $pluginDefinition, $container
->get('entity_type.manager'), $container
->get('entity.repository'), $container
->get('graphql.buffer.entity'));
}
/**
* EntityQueryEntities constructor.
*
* @param array $configuration
* The plugin configuration array.
* @param string $pluginId
* The plugin id.
* @param mixed $pluginDefinition
* The plugin definition array.
* @param \Drupal\Core\Entity\EntityTypeManagerInterface $entityTypeManager
* The entity type manager service.
* @param \Drupal\Core\Entity\EntityRepositoryInterface $entityRepository
* The entity repository service.
* @param \Drupal\graphql\GraphQL\Buffers\EntityBuffer $entityBuffer
* The entity buffer service.
*/
public function __construct(array $configuration, $pluginId, $pluginDefinition, EntityTypeManagerInterface $entityTypeManager, EntityRepositoryInterface $entityRepository, EntityBuffer $entityBuffer) {
parent::__construct($configuration, $pluginId, $pluginDefinition);
$this->entityTypeManager = $entityTypeManager;
$this->entityRepository = $entityRepository;
$this->entityBuffer = $entityBuffer;
}
/**
* {@inheritdoc}
*/
public function resolveValues($value, array $args, ResolveContext $context, ResolveInfo $info) {
if ($value instanceof QueryInterface) {
$type = $value
->getEntityTypeId();
$result = $value
->execute();
$metadata = $value
->getMetaData('graphql_context');
if (isset($metadata['ids']) && ($sorting = $metadata['ids'])) {
$sorting = array_flip(array_values($sorting));
uasort($result, function ($a, $b) use ($sorting) {
return $sorting[$a] - $sorting[$b];
});
}
if ($value
->hasTag('revisions')) {
// If this is a revision query, the version ids are the array keys.
return $this
->resolveFromRevisionIds($type, array_keys($result), $metadata, $args, $context, $info);
}
return $this
->resolveFromEntityIds($type, array_values($result), $metadata, $args, $context, $info);
}
}
/**
* Resolves entities lazily through the entity buffer.
*
* @param string $type
* The entity type.
* @param array $ids
* The entity ids to load.
* @param mixed $metadata
* The query context.
* @param array $args
* The field arguments array.
* @param \Drupal\graphql\GraphQL\Execution\ResolveContext $context
* The resolve context.
* @param \GraphQL\Type\Definition\ResolveInfo $info
* The resolve info object.
*
* @return \Closure
* The deferred resolver.
*/
protected function resolveFromEntityIds($type, $ids, $metadata, array $args, ResolveContext $context, ResolveInfo $info) {
$resolve = $this->entityBuffer
->add($type, $ids);
return function ($value, array $args, ResolveContext $context, ResolveInfo $info) use ($resolve, $metadata) {
return $this
->resolveEntities($resolve(), $metadata, $args, $context, $info);
};
}
/**
* Resolves entity revisions.
*
* @param string $type
* The entity type.
* @param array $ids
* The entity revision ids to load.
* @param mixed $metadata
* The query context.
* @param array $args
* The field arguments array.
* @param \Drupal\graphql\GraphQL\Execution\ResolveContext $context
* The resolve context.
* @param \GraphQL\Type\Definition\ResolveInfo $info
* The resolve info object.
*
* @return \Generator
* The resolved revisions.
*/
protected function resolveFromRevisionIds($type, $ids, $metadata, array $args, ResolveContext $context, ResolveInfo $info) {
$storage = $this->entityTypeManager
->getStorage($type);
$entities = array_map(function ($id) use ($storage) {
return $storage
->loadRevision($id);
}, $ids);
return $this
->resolveEntities($entities, $metadata, $args, $context, $info);
}
/**
* Resolves entity objects and checks view permissions.
*
* @param array $entities
* The entities to resolve.
* @param mixed $metadata
* The query context.
* @param array $args
* The field arguments array.
* @param \Drupal\graphql\GraphQL\Execution\ResolveContext $context
* The resolve context.
* @param \GraphQL\Type\Definition\ResolveInfo $info
* The resolve info object.
*
* @return \Generator
* The resolved entities.
*/
protected function resolveEntities(array $entities, $metadata, array $args, ResolveContext $context, ResolveInfo $info) {
$language = $this
->negotiateLanguage($metadata, $args, $context, $info);
/** @var \Drupal\Core\Entity\EntityInterface $entity */
foreach ($entities as $entity) {
// Translate the entity if it is translatable and a language was given.
if ($language && $entity instanceof TranslatableInterface && $entity
->isTranslatable()) {
if ($entity
->hasTranslation($language)) {
$entity = $entity
->getTranslation($language);
}
}
$access = $entity
->access('view', NULL, TRUE);
if ($access
->isAllowed()) {
(yield $entity
->addCacheableDependency($access));
}
else {
(yield new CacheableValue(NULL, [
$access,
]));
}
}
}
/**
* Negotiate the language for the resolved entities.
*
* @param mixed $metadata
* The query context.
* @param array $args
* The field arguments array.
* @param \Drupal\graphql\GraphQL\Execution\ResolveContext $context
* The resolve context.
* @param \GraphQL\Type\Definition\ResolveInfo $info
* The resolve info object.
*
* @return string|null
* The negotiated language id.
*/
protected function negotiateLanguage($metadata, $args, ResolveContext $context, ResolveInfo $info) {
if (!empty($args['language'])) {
return $args['language'];
}
if (isset($metadata['parent']) && ($parent = $metadata['parent']) && $parent instanceof EntityInterface) {
return $parent
->language()
->getId();
}
return NULL;
}
}
Members
Name | Modifiers | Type | Description | Overrides |
---|---|---|---|---|
ArgumentAwarePluginTrait:: |
protected | function | Builds an argument's default value. | |
ArgumentAwarePluginTrait:: |
protected | function | Builds an argument's description. | |
ArgumentAwarePluginTrait:: |
protected | function | Builds the list of arguments. | |
ArgumentAwarePluginTrait:: |
protected | function | Builds an argument's type. | |
CacheablePluginTrait:: |
protected | function | ||
DependencySerializationTrait:: |
protected | property | An array of entity type IDs keyed by the property name of their storages. | |
DependencySerializationTrait:: |
protected | property | An array of service IDs keyed by property name used for serialization. | |
DependencySerializationTrait:: |
public | function | 1 | |
DependencySerializationTrait:: |
public | function | 2 | |
DeprecatablePluginTrait:: |
protected | function | ||
DescribablePluginTrait:: |
protected | function | ||
EntityQueryEntities:: |
protected | property | The entity buffer service. | |
EntityQueryEntities:: |
protected | property | The entity repository service. | |
EntityQueryEntities:: |
protected | property | The entity type manager service. | |
EntityQueryEntities:: |
public static | function |
Creates an instance of the plugin. Overrides ContainerFactoryPluginInterface:: |
|
EntityQueryEntities:: |
protected | function | Negotiate the language for the resolved entities. | |
EntityQueryEntities:: |
protected | function | Resolves entity objects and checks view permissions. | |
EntityQueryEntities:: |
protected | function | Resolves entities lazily through the entity buffer. | |
EntityQueryEntities:: |
protected | function | Resolves entity revisions. | |
EntityQueryEntities:: |
public | function |
Retrieve the list of field values. Overrides FieldPluginBase:: |
|
EntityQueryEntities:: |
public | function |
EntityQueryEntities constructor. Overrides PluginBase:: |
|
FieldPluginBase:: |
protected | property | Static cache for `isLanguageAwareField()` | |
FieldPluginBase:: |
protected | property | The language context service. | |
FieldPluginBase:: |
protected | property | The renderer service. | 1 |
FieldPluginBase:: |
public static | function |
Overrides FieldPluginInterface:: |
|
FieldPluginBase:: |
protected | function | Retrieve the list of cache dependencies for a given value and arguments. | 1 |
FieldPluginBase:: |
public | function |
Returns the plugin's type or field definition for the schema. Overrides FieldPluginInterface:: |
|
FieldPluginBase:: |
protected | function | Get the language context instance. | |
FieldPluginBase:: |
protected | function | Get the renderer service. | |
FieldPluginBase:: |
protected | function | Indicator if the field is language aware. | 1 |
FieldPluginBase:: |
public | function | 1 | |
FieldPluginBase:: |
protected | function | ||
FieldPluginBase:: |
protected | function | Unwrap the resolved values. | |
PluginBase:: |
protected | property | Configuration information passed into the plugin. | 1 |
PluginBase:: |
protected | property | The plugin implementation definition. | 1 |
PluginBase:: |
protected | property | The plugin_id. | |
PluginBase:: |
constant | A string which is used to separate base plugin IDs from the derivative ID. | ||
PluginBase:: |
public | function |
Gets the base_plugin_id of the plugin instance. Overrides DerivativeInspectionInterface:: |
|
PluginBase:: |
public | function |
Gets the derivative_id of the plugin instance. Overrides DerivativeInspectionInterface:: |
|
PluginBase:: |
public | function |
Gets the definition of the plugin implementation. Overrides PluginInspectionInterface:: |
3 |
PluginBase:: |
public | function |
Gets the plugin_id of the plugin instance. Overrides PluginInspectionInterface:: |
|
PluginBase:: |
public | function | Determines if the plugin is configurable. | |
TypedPluginTrait:: |
protected | function |