Relay support for our GraphQL implementation.
- PHP >= 7.1
Run the following command to install the package through Composer:
composer require digiaonline/graphql-relay:dev-master
Executing this script:
use function Digia\GraphQL\buildSchema;
use function Digia\GraphQL\graphql;
$source = file_get_contents(__DIR__ . '/star-wars.graphqls');
$schema = buildSchema($source, [
'Query' => [
'rebels' => function () {
return rebels();
},
'empire' => function () {
return empire();
}
],
'Faction' => [
'ships' => function ($faction, $args) {
$data = getShips($faction);
$arguments = ConnectionArguments::fromArray($args);
return ArrayConnectionBuilder::fromArray($data, $arguments);
}
]
]);
$result = graphql($schema, '
query RebelsShipsQuery {
rebels {
name,
ships(first: 1) {
edges {
node {
name
}
}
}
}
}');
print_r($result);
Produces the following output:
Array
(
[rebels] => Array
(
[name] => Alliance to Restore the Republic
[ships] => Array
(
[edges] => Array
(
[0] => Array
(
[node] => Array
(
[name] => X-Wing
)
)
)
)
)
)
The schema definition used looks like this:
"A connection to a list of items."
interface Connection {
"A list of edges."
edges: [Edge]
"Information to aid in pagination."
pageInfo: PageInfo!
}
"An edge in a connection."
interface Edge {
"A cursor for use in pagination."
cursor: String!
"The item at the end of the edge."
node: Node
}
"An object with an ID."
interface Node {
"ID of the object."
id: ID!
}
"Information about pagination in a connection."
type PageInfo {
"When paginating forwards, are there more items?"
hasPreviousPage: Boolean!
"When paginating backwards, are there more items?"
hasNextPage: Boolean!
"When paginating backwards, the cursor to continue."
endCursor: String
"When paginating forwards, the cursor to continue."
startCursor: String
}
type Faction implements Node {
"The ID of an object."
id: ID!
"The name of the faction."
name: String
"The ships used by the faction."
ships(after: String, before: String, first: Int, last: Int): ShipConnection
}
"A ship in the Star Wars saga"
type Ship implements Node {
"The ID of an object."
id: ID!
"The name of the ship."
name: String
}
type ShipConnection implements Connection {
edges: [ShipEdge]
pageInfo: PageInfo!
}
type ShipEdge implements Edge {
cursor: String!
node: Ship
}
type Query {
rebels: Faction
empire: Faction
node(id: ID!): Node
}
schema {
query: Query
}
For implementing the Node root field a convenience class is provided:
$nodeId = Node::toGlobalId('Ship', '1');
returns a global ID which can be passed to the node root:
U2hpcDox
$node = Node::fromGlobalId('U2hpcDox');
returns an object which can be queried:
$node->getType(); // Ship
$node->getId(); // 1
For an example of how to implement the node root resolver please check the StarWarsConnectionTest.php
Please read our guidelines.
See LICENSE.