Inheritance and interfaces
Some of your entities may extend other entities. GraphQLite will do its best to represent this hierarchy of objects in GraphQL using interfaces.
Let's say you have two classes, Contact
and User
(which extends Contact
):
/**
* @Type
*/
class Contact
{
// ...
}
/**
* @Type
*/
class User extends Contact
{
// ...
}
Now, let's assume you have a query that returns a contact:
class ContactController
{
/**
* @Query()
*/
public function getContact(): Contact
{
// ...
}
}
When writing your GraphQL query, you are able to use fragments to retrieve fields from the User
type:
contact {
name
... User {
email
}
}
Written in GraphQL type language, the representation of types would look like this:
interface ContactInterface {
// List of fields declared in Contact class
}
type Contact implements ContactInterface {
// List of fields declared in Contact class
}
type User implements ContactInterface {
// List of fields declared in Contact and User classes
}
Behind the scene, GraphQLite will detect that the Contact
class is extended by the User
class.
Because the class is extended, a GraphQL ContactInterface
interface is created dynamically.
The GraphQL User
type will also automatically implement this ContactInterface
. The interface contains all the fields
available in the Contact
type.
GraphQLite automatically declares interfaces when it sees an inheritance relationship between to classes that are GraphQL types.