Custom output types
In some special cases, you want to override the GraphQL return type that is attributed by default by GraphQLite.
For instance:
/**
* @Type(class=Product::class)
*/
class ProductType
{
/**
* @Field(name="id")
*/
public function getId(Product $source): string
{
return $source->getId();
}
}
In the example above, GraphQLite will generate a GraphQL schema with a field id
of type string
:
type Product {
id: String!
}
GraphQL comes with an ID
scalar type. But PHP has no such type. So GraphQLite does not know when a variable
is an ID
or not.
You can help GraphQLite by manually specifying the output type to use:
/**
* @Field(name="id", outputType="ID!")
*/
Usage
The outputType
attribute will map the return value of the method to the output type passed in parameter.
You can use the outputType
attribute in the following annotations:
@Query
@Mutation
@Field
@SourceField
Registering a custom output type (advanced)
In order to create a custom output type, you need to:
- Design a class that extends
GraphQL\Type\Definition\ObjectType
. - Register this class in the GraphQL schema.
You'll find more details on the Webonyx documentation.
In order to find existing types, the schema is using type mappers (classes implementing the TypeMapperInterface
interface).
You need to make sure that one of these type mappers can return an instance of your type. The way you do this will depend on the framework you use.
Symfony users
Any class extending GraphQL\Type\Definition\ObjectType
(and available in the container) will be automatically detected
by Symfony and added to the schema.
If you want to automatically map the output type to a given PHP class, you will have to explicitly declare the output type
as a service and use the graphql.output_type
tag:
# config/services.yaml
services:
App\MyOutputType:
tags:
- { name: 'graphql.output_type', class: 'App\MyPhpClass' }
Other frameworks
The easiest way is to use a StaticTypeMapper
. This class is used to register custom output types.
// Sample code:
$staticTypeMapper = new StaticTypeMapper();
// Let's register a type that maps by default to the "MyClass" PHP class
$staticTypeMapper->setTypes([
MyClass::class => new MyCustomOutputType()
]);
// If you don't want your output type to map to any PHP class by default, use:
$staticTypeMapper->setNotMappedTypes([
new MyCustomOutputType()
]);
The StaticTypeMapper
instance MUST be registered in your container and linked to a CompositeTypeMapper
that will aggregate all the type mappers of the application.