



GraphQL Resolver


PHP Ports for GraphQL

1. Design and develop resolver for queries, process schema and presenters
2. Choose between pagination options and implement chosen one
3. Create ResultHandler and ErrorHandler (who said it would be easy)
4. Create endpoint
5. Send a query
TODO list:

Resolver.php

CreateWishlistResolver.php

Input types:
CreateWishlistResolver.php

WishlistSchema.php
wishlists (first: 10, after: "cursor") {
edges {
cursor,
node {
id,
name,
items {
id,
type
}
}
},
totalCount,
pageInfo {
startCursor,
endCursor,
hasNextPage,
hasPreviousPage
}
}

Cursor
Offset

wishlists (first: $first, offset: $offset) {
edges {
id,
name,
items {
id,
type
}
},
pageInfo {
first,
offset,
total,
hasNextPage,
hasPreviousPage
}
}



NodePresenter.php
CollectionPresenter.php

AbstractPresenter.php

ResultHandler.php

use GraphQL\Error\ClientAware;
GraphQLException.php

Request Clients
Controller.php


CruiseType {
reservationNumber,
checkInTime,
departureTime,
departureCity,
departurePort,
cruiseShip,
cruiseLine,
arrivalTime,
checkOutTime,
arrivalCity,
arrivalPort,
stops,
bookingClass,
additionalInformation
}
RailwayType {
ticketNumber,
departureTime,
departureCity,
trainNumber,
trainPlace,
arrivalTime,
arrivalCity,
bookingClass
}
BookingType {
id
}
BookingType {
… on CruiseType {
reservationNumber,
checkInTime,
departureTime,
departureCity,
departurePort,
cruiseShip,
cruiseLine,
arrivalTime,
checkOutTime,
arrivalCity,
arrivalPort,
stops,
bookingClass,
additionalInformation
},
… on RailwayTripType {
ticketNumber,
departureTime,
departureCity,
trainNumber,
trainPlace,
arrivalTime,
arrivalCity,
bookingClass
}
}
UnionType
'bookingType' =>
$this->getBookingUnionType('BookingTypeInterfaceType')

SchemaDecorator.php

CreateWishlistResolver.php


File Upload
'args' => [ 'file' => new UploadType()]
FileUploaderResolver.php
mutation(
$file: Upload
) {
uploadYourFileHere(
file: $file
) {
File {
path,
name
}
}
FileUpload Mutation Example
Don't query unreliable data! You don't need it.
Wishlist {
id,
name
}
Wishlist {
id,
name,
items {
id,
type,
name,
category,
price,
currency
}
}


Optimization
No recursions! You can do better than this!
Author {
name,
books {
title,
authors {
name,
books
}
}
}

wishlists (first: $first, offset: $offset) { #fetches wishlists (N queries)
edges {
id,
name,
items { #fetches items for each wishlist (M queries per wishlist)
id,
type
}
},
pageInfo {
first,
offset,
total,
hasNextPage,
hasPreviousPage
}
} # therefore M*N queries
N + 1
Solutions
NoSQL
Cache

GraphQL: change for the best
By Anastasia Lysenko
GraphQL: change for the best
How one can use GraphQL with PHP from scratch. Practical cases and optimization advice.
- 859