GraphQL schema library.
$ composer require oligus/schemaQuick start
Types
Type modifiers
Scalar
Built in scalar types
Objects
Interfaces
Enums
Inputs
Fields
Arguments
Argument values
Development
$schema = newSchema();
// Add directive$directive = newDirectiveType('upper');
$directive->addLocation(ExecutableDirectiveLocation::FIELD());
$schema->addDirective($directive);
// Add interface$interface = (newInterfaceType('Entity'))
->addField(newField('id', newIDType(), newTypeModifier(false)))
->addField(newField('name', newStringType()));
$schema->addInterface($interface);
// Add scalar$scalar = newScalarType('Url');
$schema->addScalar($scalar);
// Add object$object = (newObjectType('User'))
->addField(newField('id', newIDType(), newTypeModifier(false)))
->addField(newField('name', newStringType()))
->addField(newField('age', newIntegerType()))
->addField(newField('balance', newFloatType()))
->addField(newField('isActive', newBooleanType()));
$object->addField(newField('friends', $object, newTypeModifier(true, true, false)))
->addField(newField('homepage', $scalar))
->implements($interface);
$schema->addObject($object);
// Add query object$query = (newObjectType('Query'))
->addField(newField('me', $object, newTypeModifier(true)));
$field = (newField('friends', $object, newTypeModifier(true, true, false)))
->addArgument(newArgument('limit', newIntegerType(), newTypeModifier(), newValueInteger(10)));
$query->addField($field);
$schema->addObject($query);
// Add input object$input = (newInputType('ListUsersInput'))
->addField(newField('limit', newIntegerType()))
->addField(newField('since_id', newIDType()));
$schema->addInput($input);
// Add mutation object$mutation = newObjectType('Mutation');
$field = (newField('users', $object, newTypeModifier(true, true, false)))
->addArgument(newArgument('params', $input));
$mutation->addField($field);
$schema->addObject($mutation);
// Add union$union = (newUnionType('MyUnion'))
->addObjectType(newObjectType('Dog'))
->addObjectType(newObjectType('Cat'))
->addObjectType(newObjectType('Bird'));
$schema->addUnion($union);
// Set root types$schema->setQuery($query);
$schema->setMutation($mutation);
$serializer = newSchemaSerializer();
$serializer->serialize($schema);Result:
directive@upperonFIELDinterfaceEntity {
id: ID!name: String
}
scalarUrlunionMyUnion = Dog | Cat | BirdtypeUserimplementsEntity {
id: ID!name: Stringage: Intbalance: FloatisActive: Booleanfriends: [User]!homepage: Url
}
typeQuery {
me: Userfriends(limit: Int = 10): [User]!
}
typeMutation {
users(params: ListUsersInput): [User]!
}
inputListUsersInput {
limit: Intsince_id: ID
}
schema {
query: Querymutation: Mutation
}The fundamental unit of any GraphQL Schema is the type. There are six kinds of named type definitions in GraphQL, and two wrapping types.
Available types:
ScalarType
BooleanType
FloatType
IDType
IntegerType
StringType
InterfaceTypeType modifiers are used in conjunction with types, add modifier to a type to modify the type in question.
TypeModifier(?bool $nullable, ?bool $listable, ?bool $nullableList)
Modifiers
| Type | Syntax | Example |
|---|---|---|
| Nullable Type | <type> | String |
| Non-null Type | <type>! | String! |
| List Type | [<type>] | [String] |
| List of Non-null Types | [<type>!] | [String!] |
| Non-null List Type | [<type>]! | [String]! |
| Non-null List of Non-null Types | [<type>!]! | [String!]! |
$typeModifier = newTypeModifier($nullable = false, $listable = true, $nullableList = false);
$type = newBooleanType($typeModifier);Result:
[bool!]!Scalar types represent primitive leaf values in a GraphQL type system. GraphQL responses take the form of a hierarchical tree; the leaves on these trees are GraphQL scalars.
Scalar(string $name, ?string $description)
$scalar = newScalarType('Url', 'Url description');Result:
"""Url description"""scalarUrlGraphQL provides a basic set of well‐defined Scalar types. A GraphQL server should support all of these types.
Built in types:Boolean, Float, ID, Integer, String
<TYPE>Type(?TypeModifier $modifier)
Where <TYPE> is Boolean, Float, ID, Integer or String
$type = newBooleanType();Result:
BooleanGraphQL queries are hierarchical and composed, describing a tree of information. While Scalar types describe the leaf values of these hierarchical queries, Objects describe the intermediate levels.
ObjectType(string $name, ?string $description = null)
$object = newObjectType('Wine');
$object->addField(newField('name', newStringType()));
$object->addField(newField('age', newIntegerType()));
$object->addField(newField('size', newIntegerType()));Result:
typeWine {
name: Stringage: Intsize: Int
}Implement interface
$interface = newInterfaceType('Wine');
$interface->addField(newField('name', newStringType()));
$object->implements($interface);Result:
typeWineimplementsName {
name: Stringage: Intsize: Int
}GraphQL interfaces represent a list of named fields and their arguments. GraphQL objects can then implement these interfaces which requires that the object type will define all fields defined by those interfaces.
InterfaceType(string $name, ?string $description = null)
$interface = newInterfaceType('Wine');
$interface->addField(newField('name', newStringType()));
$interface->addField(newField('age', newIntegerType()));
$interface->addField(newField('size', newIntegerType()));Result:
interfaceWine {
name: Stringage: Intsize: Int
}GraphQL Unions represent an object that could be one of a list of GraphQL Object types, but provides for no guaranteed fields between those types. They also differ from interfaces in that Object types declare what interfaces they implement, but are not aware of what unions contain them.
UnionType(string $name, ?string $description = null)
Add object:
addObjectType(ObjectType $objectType): void
$union = newUnionType('Animals');
$union->addObjectType(newObjectType('Dog'));
$union->addObjectType(newObjectType('Cat'));Result:
unionAnimals = Dog | CatGraphQL Enum types, like scalar types, also represent leaf values in a GraphQL type system. However Enum types describe the set of possible values.
EnumType(string $name, ?string $description = null, array $enums = [])
Add enum:
add(string $enum)
$enum = newEnumType('Direction', 'Different directions', ['SOUTH', 'NORTH']);
$enum->addEnum('EAST');
$enum->addEnum('WEST');Result:
"""Different directions"""enumDirection {
SOUTH NORTH EAST WEST
}A GraphQL schema describes directives which are used to annotate various parts of a GraphQL document as an indicator that they should be evaluated differently by a validator, executor, or client tool such as a code generator.
EnumType(string $name, ?string $description = null, array $enums = [])
Add locations:
add(ExecutableDirectiveLocation $location)
$directive = newDirectiveType('example', 'Example directive');
$directive->addLocation(ExecutableDirectiveLocation::FIELD());
$directive->addLocation(ExecutableDirectiveLocation::INLINE_FRAGMENT());Result:
"""Example directive"""directive@exampleonFIELD | FRAGMENT_SPREADFields may accept arguments to configure their behavior. These inputs are often scalars or enums, but they sometimes need to represent more complex values.
InputType(string $name, ?string $description = null)
Add field:
addField(Field $field): void
$object = newInputType('Animal');
$object->addField(newField('name', newStringType()));
$object->addField(newField('age', newIntegerType()));
$object->addField(newField('weight', newIntegerType()));Result:
inputAnimal {
name: Stringage: Intweight: Int
}A selection set is primarily composed of fields. A field describes one discrete piece of information available to request within a selection set.
Field(string $name, Type $type, ?TypeModifier $typeModifier, ?string $description)
$field = newField('simpleField', newIntegerType());Result:
simpleField: IntWith type modifier:
$field = newField('simpleField', newIntegerType(), newTypeModifier($nullable = false));Result:
simpleField: Int!With type argument:
$field = newField('booleanListArgField', newBooleanType(), newTypeModifier(true, true));
$argument = newArgument('booleanListArg', newBooleanType(), newTypeModifier(true, true, false));
$field->addArgument($argument);Fields are conceptually functions which return values, and occasionally accept arguments which alter their behavior. These arguments often map directly to function arguments within a GraphQL server’s implementation.
Argument(string $name, Type $type, ?TypeModifier $typeModifier, ?Value $defaultVale)
$argument = newArgument('booleanArg', newBooleanType());Result:
booleanArg: BooleanWith type modifier:
$argument = newArgument('intArg', newIntegerType(), newTypeModifier(false));
// intArg: Int! = 0With type default value:
$argument = newArgument('intArg', newIntegerType(), null, newValueInteger(0));
// intArg: Int = 0Set simple scalar values for default values in arguments.
Value(mixed $value)
Available values:ValueBoolean, ValueFloat, ValueInteger, ValueNull, ValueString
$bool = newValueBoolean(true);
$bool->getValue(); // trueecho$bool; // 'true'Download and build docker container
$ makeAccess docker image
$ make bash