RouteEntity.php in GraphQL 8.4
File
src/Plugin/GraphQL/DataProducer/Routing/RouteEntity.php
View source
<?php
namespace Drupal\graphql\Plugin\GraphQL\DataProducer\Routing;
use Drupal\Core\DependencyInjection\DependencySerializationTrait;
use Drupal\Core\Entity\EntityTypeManagerInterface;
use Drupal\Core\Entity\TranslatableInterface;
use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
use Drupal\Core\Url;
use Drupal\graphql\GraphQL\Buffers\EntityBuffer;
use Drupal\graphql\GraphQL\Execution\FieldContext;
use Drupal\graphql\Plugin\GraphQL\DataProducer\DataProducerPluginBase;
use GraphQL\Deferred;
use Symfony\Component\DependencyInjection\ContainerInterface;
class RouteEntity extends DataProducerPluginBase implements ContainerFactoryPluginInterface {
use DependencySerializationTrait;
protected $entityTypeManager;
protected $entityBuffer;
public static function create(ContainerInterface $container, array $configuration, $pluginId, $pluginDefinition) {
return new static($configuration, $pluginId, $pluginDefinition, $container
->get('entity_type.manager'), $container
->get('graphql.buffer.entity'));
}
public function __construct(array $configuration, $pluginId, $pluginDefinition, EntityTypeManagerInterface $entityTypeManager, EntityBuffer $entityBuffer) {
parent::__construct($configuration, $pluginId, $pluginDefinition);
$this->entityTypeManager = $entityTypeManager;
$this->entityBuffer = $entityBuffer;
}
public function resolve($url, ?string $language, FieldContext $context) : ?Deferred {
if ($url instanceof Url) {
list(, $type) = explode('.', $url
->getRouteName());
$parameters = $url
->getRouteParameters();
$id = $parameters[$type];
$resolver = $this->entityBuffer
->add($type, $id);
return new Deferred(function () use ($type, $resolver, $context, $language) {
if (!($entity = $resolver())) {
$type = $this->entityTypeManager
->getDefinition($type);
$tags = $type
->getListCacheTags();
$context
->addCacheTags($tags)
->addCacheTags([
'4xx-response',
]);
return NULL;
}
if (isset($language) && $language != $entity
->language()
->getId() && $entity instanceof TranslatableInterface) {
$entity = $entity
->getTranslation($language);
$entity
->addCacheContexts([
"static:language:{$language}",
]);
}
$access = $entity
->access('view', NULL, TRUE);
$context
->addCacheableDependency($access);
if ($access
->isAllowed()) {
return $entity;
}
return NULL;
});
}
return NULL;
}
}
Classes
Name |
Description |
RouteEntity |
Loads the entity associated with the current URL. |