Mutations
Last updated
Was this helpful?
Was this helpful?
extend type Mutation {
createArticle(data: ArticleInput): Article
}<?php
namespace Drupal\graphql_composable\Plugin\GraphQL\DataProducer;
use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
use Drupal\Core\Plugin\Context\ContextDefinition;
use Drupal\Core\Session\AccountInterface;
use Drupal\Core\StringTranslation\TranslatableMarkup;
use Drupal\graphql\Attribute\DataProducer;
use Drupal\graphql\Plugin\GraphQL\DataProducer\DataProducerPluginBase;
use Drupal\node\Entity\Node;
use Symfony\Component\DependencyInjection\ContainerInterface;
/**
* Creates a new article entity.
*/
#[DataProducer(
id: 'graphql_docs_create_article',
name: new TranslatableMarkup('Create Article'),
description: new TranslatableMarkup('Creates a new article.'),
produces: new ContextDefinition(
data_type: 'any',
label: new TranslatableMarkup('Article'),
),
consumes: [
'data' => new ContextDefinition(
data_type: 'any',
label: new TranslatableMarkup('Article data'),
),
],
)]
class CreateArticle extends DataProducerPluginBase implements ContainerFactoryPluginInterface {
/**
* The current user.
*/
protected AccountInterface $currentUser;
/**
* {@inheritdoc}
*/
public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
return new static(
$configuration,
$plugin_id,
$plugin_definition,
$container->get('current_user')
);
}
/**
* CreateArticle constructor.
*
* @param array $configuration
* A configuration array containing information about the plugin instance.
* @param string $plugin_id
* The plugin_id for the plugin instance.
* @param array $plugin_definition
* The plugin implementation definition.
* @param \Drupal\Core\Session\AccountInterface $current_user
* The current user.
*/
public function __construct(array $configuration, string $plugin_id, array $plugin_definition, AccountInterface $current_user) {
parent::__construct($configuration, $plugin_id, $plugin_definition);
$this->currentUser = $current_user;
}
/**
* Creates an article.
*
* @param array $data
* The title of the job.
*
* @return \Drupal\Core\Entity\EntityBase|\Drupal\Core\Entity\EntityInterface
* The newly created article.
*
* @throws \Exception
*/
public function resolve(array $data) {
if ($this->currentUser->hasPermission("create article content")) {
$values = [
'type' => 'article',
'title' => $data['title'],
'body' => $data['description'],
];
$node = Node::create($values);
$node->save();
return $node;
}
return NULL;
}
}/**
* {@inheritdoc}
*/
public function registerResolvers(ResolverRegistryInterface $registry) {
...
// Create article mutation.
$registry->addFieldResolver('Mutation', 'createArticle',
$builder->produce('graphql_docs_create_article')
->map('data', $builder->fromArgument('data'))
);
...
return $registry;
}mutation {
createArticle(data: { title: "Hello GraphQl 2" }) {
... on Article {
id
title
}
}
}{
"data": {
"createArticle": {
"id": 2,
"title": "Hello GraphQl 2"
}
}
}