Doctrine GraphQL Mapper
Builds GraphQL types out of doctrine entities
WARNING: This repo is not stable yet. Please use at your own risk
Installation
$> curl -sS https://getcomposer.org/installer | php
$> php composer.phar require rahuljayaraman/doctrine-graphql
Requirements
PHP >=5.4
Overview
The mapper builds GraphQL types out of doctrine entities. It's built on top of webonyx/graphql-php and maps doctrine entities to an ObjectType graph at runtime.
Here's an example. Consider the following schema
Employee
│
└───Company (getCompanies)
|
└───User (getUser)
We can extract the type for Employee by using
Mapper::extractType(Employee::class)
Associations are recursively extracted as well. So $employee->getCompanies()
would return ListOf Type Company & $employee->getUser()
would return Type User
NOTE: This library is not responsible for any of your GraphQL setup like setting up routes, root nodes etc.
TODO
Usage
Setup
Setup accepts 3 args. Doctrine's EntityManager, a setter method & a getter method to a type store (a data structure which stores types).
//Setup code, I use this in a laravel service provider
use RahulJayaraman\DoctrineGraphQL\Mapper;
use Doctrine\ORM\EntityManager;
Mapper::setup(
app(EntityManager::class),
function ($typeName, $type) {
Cache::add($type, $typeName);
},
function ($typeName) {
return Cache::get($typeName);
}
);
Cache
above could be replaced by any store.
Eg. using Folkloreatelier/laravel-graphql's store
use Folklore\GraphQL\Support\Facades\GraphQL;
Mapper::setup(
app(EntityManager::class),
function ($typeName, $type) {
GraphQL::addType($type, $typeName);
},
function ($typeName) {
return GraphQL::type($typeName);
}
);
Extract type
To extract the type
Mapper::extractType(Entity::class);
We could place it here if using with Folkloreatelier/laravel-graphql.
public function type()
{
return Mapper::extractType(Entity::class);
}
Default resolver
For now, given a field name, say fieldName
, the mapper will look for a getFieldName
getter method on the entity. There are plans to allow customization here.
Register additional fields
For registering additional fields, on can use the RegisterField annotation.
RegisterField accepts name
, type
and args
.
name
accepts a string.
type
accepts either an internal type or any of the extracted entities.
args
accepts an array of tuples in the form of {{string, type}}
Here's an example
use RahulJayaraman\DoctrineGraphQL\Annotations\RegisterField;
/**
* getEmployee
*
* @RegisterField(name="CustomName" type="Employee", args={{"slug", "string"}})
*/
public function getEmployee($slug)
{
return ...
}
Blacklist fields
Fields can be blacklisted using the BlacklistField annotation. Here's an example.
use RahulJayaraman\DoctrineGraphQL\Annotations\BlacklistField;
/**
* @var string
* @ORM\Column(type="string")
* @BlacklistField()
*/
private $password;