graphql_compose-1.0.0-beta20/modules/graphql_compose_blocks/src/Plugin/GraphQL/DataProducer/BlockLoad.php
modules/graphql_compose_blocks/src/Plugin/GraphQL/DataProducer/BlockLoad.php
<?php
declare(strict_types=1);
namespace Drupal\graphql_compose_blocks\Plugin\GraphQL\DataProducer;
use Drupal\Core\Block\BlockManagerInterface;
use Drupal\Core\Block\BlockPluginInterface;
use Drupal\Core\Entity\EntityRepositoryInterface;
use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
use Drupal\Core\Plugin\Context\ContextDefinition;
use Drupal\Core\Session\AccountProxyInterface;
use Drupal\Core\StringTranslation\TranslatableMarkup;
use Drupal\graphql\Attribute\DataProducer;
use Drupal\graphql\GraphQL\Execution\FieldContext;
use Drupal\graphql\Plugin\GraphQL\DataProducer\DataProducerPluginBase;
use Symfony\Component\DependencyInjection\ContainerInterface;
/**
* Load drupal blocks.
*/
#[DataProducer(
id: "block_load",
name: new TranslatableMarkup("Block loader"),
description: new TranslatableMarkup("Load a block."),
produces: new ContextDefinition(
data_type: "any",
label: new TranslatableMarkup("Block instance")
),
consumes: [
"id" => new ContextDefinition(
data_type: "string",
label: new TranslatableMarkup("Block plugin ID")
),
]
)]
class BlockLoad extends DataProducerPluginBase implements ContainerFactoryPluginInterface {
/**
* Constructs a BlockLoad object.
*
* @param array $configuration
* The plugin configuration.
* @param string $plugin_id
* The plugin id.
* @param mixed $plugin_definition
* The plugin definition.
* @param \Drupal\Core\Block\BlockManagerInterface $blockManager
* Drupal block manager.
* @param \Drupal\Core\Entity\EntityRepositoryInterface $entityRepository
* Drupal entity repository.
* @param \Drupal\Core\Session\AccountProxyInterface $currentUser
* The current user.
*/
public function __construct(
array $configuration,
$plugin_id,
$plugin_definition,
protected BlockManagerInterface $blockManager,
protected EntityRepositoryInterface $entityRepository,
protected AccountProxyInterface $currentUser,
) {
parent::__construct($configuration, $plugin_id, $plugin_definition);
}
/**
* {@inheritdoc}
*/
public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
return new static(
$configuration,
$plugin_id,
$plugin_definition,
$container->get('plugin.manager.block'),
$container->get('entity.repository'),
$container->get('current_user'),
);
}
/**
* Resolve the layout definition.
*
* @param string $block_id
* The block plugin ID.
* @param \Drupal\graphql\GraphQL\Execution\FieldContext $context
* The cache context.
*
* @return \Drupal\Core\Block\BlockPluginInterface|null
* The block plugin instance.
*/
public function resolve(string $block_id, FieldContext $context): ?BlockPluginInterface {
/** @var \Drupal\Core\Block\BlockPluginInterface $block_instance */
$block_instance = $this->blockManager->createInstance($block_id);
$context->addCacheableDependency($block_instance);
$access = $block_instance->access($this->currentUser->getAccount(), TRUE);
$context->addCacheableDependency($access);
if (!$access->isAllowed()) {
return NULL;
}
$plugin_definition = $block_instance->getPluginDefinition();
// Don't return broken block plugin instances.
if ($plugin_definition['id'] === 'broken') {
return NULL;
}
if ($plugin_definition['id'] === 'block_content') {
$uuid = $block_instance->getDerivativeId();
// Don't return broken block content instances.
if (!$this->entityRepository->loadEntityByUuid('block_content', $uuid)) {
return NULL;
}
}
return $block_instance;
}
}
