protected function getResolverRegistry() {
$builder = new ResolverBuilder();
$registry = new ResolverRegistry([
'Article' => ContextDefinition::create('entity:node')
->addConstraint('Bundle', 'article'),
// Tell GraphQL how to resolve types of a common interface.
$registry->addTypeResolver('NodeInterface', function ($value) {
if ($value instanceof NodeInterface) {
switch ($value->bundle()) {
case 'article': return 'Article';
case 'page': return 'Page';
throw new Error('Could not resolve content type.');
$registry->addFieldResolver('Query', 'article',
$builder->produce('entity_load')
->map('type', $builder->fromValue('node'))
->map('bundles', $builder->fromValue(['article']))
->map('id', $builder->fromArgument('id'))
$registry->addFieldResolver('Article', 'id',
$builder->produce('entity_id')
->map('entity', $builder->fromParent())
$registry->addFieldResolver('Article', 'title',
$builder->produce('entity_label')
->map('entity', $builder->fromParent())
$registry->addFieldResolver('Article', 'creator',
$builder->produce('property_path')
->map('type', $builder->fromValue('entity:node'))
->map('value', $builder->fromParent())
->map('path', $builder->fromValue('field_article_creator.value'))