thank you very much okay so let's get
started
so i already introduced my talk uh
i'm gonna share my screen here
and yeah so basically there will be
three parts
in this talk the first part is about the
ecosystem the graphql ecosystem in php
it does exist and it is actually quite
large
then how to choose the right library for
your project
if you're doing some php and finally a
demo
of graphqlite
so um about the ecosystem
well i'm sure all of you already know
that when you're doing graphql you need
a graphql client in the browser and a
graphql middleware
on the server side and you have actually
implemented
implementations of graphql middlewares
in all in many languages
of course not js it started there but
also php
java c-sharp or whatever
today we're going to be zooming on php
and if we have a look at the php
graphical middlewares there are actually
two kinds
of uh such middlewares and i will split
them
a bit arbitrarily arbitrarily in two
uh sections ones that i call core
libraries
and another that i call dropper
libraries and
core libraries are actually middlewares
that are
quite low level they are used to parse
the graphical queries to serve
the the the response in json
they are really powerful but they are
kind of
hard to use the the developer the
developer experience
to use such uh library is
kind of poor they're hard to use and so
on top
of those core libraries people build
wrapper libraries which are actually
libraries that use core libraries
and that are more high level more
opinionated
certainly easier to use maybe not that
not as much powerful as the call library
but basically most of the time when you
are doing an application
you will be choosing a verbal diagram
right
in php if we have a look at core
libraries
there are not that many of them there
are actually two right now
there is webinaics which is the de facto
standard in php
almost everybody is using webinx and
then there is a newcomer that is called
ray welty which is developed by
some russian guys it's an active
development
it looks really promising there is no
solid documentation yet
so uh right now if you
need a co-library definitely go to
webonix
but keep an eye and high on
railway there was in the past
more libraries here there was one was
that was called
ushido that has been abandoned in favor
of weaponix so
right now it's pretty much robotics if
you want a core library
and then on top of this core library
there are wrapper libraries and there
are many of them
and today uh
all those libraries are using webonix
under the hood
okay it's a wrapper around webonix to
make it easier to use
so basically we have api platform and
the overblock graphql bundles that are
really
used with the symphony framework if
you're doing laravel you can use
a library called lighthouse i will be
presenting those a bit later
if you're doing um
[Music]
what uh if you're using a cms like
wordpress or drupal
wordpress and drupal have modules
to plug to present a graphql api
so if you want to do a headless cms it's
quite easy using
wordpress or drupal and adding a
a graphql module on them and then there
is graphqlite
which i've been altering for the last
two years and which is
a framework agnostic because you can use
it
whatever the framework you use
let's make a quick look uh a quick zoom
on
webonix okay so webonix it is the core
library here
and how does it look like coding with
webox well
here i've got a graphql type okay
and basically this type is a story it
has
fields with which all have types
building that in webmix the card would
look
like this okay it's kind of verbose
and as i told you the developer
experience is not that great but
basically
i'm creating a type it's its name is
history here and i've got a number of
fields that are declared here with the
type of the field the description
if i've got arguments the arguments are
declared here
and finally i have a resolver that will
be called
when i query this fill the resolver is
called
to fetch the data
this is really verbals right
and also it might look a bit like
some libraries some graphql libraries in
javascript especially if you have been
doing
been using express graphql
webonix started by mimicking a lot what
facebook was doing in its own javascript
library if i want to declare
a query well i'm creating a type query
whose fields are here it's actually
exactly the same thing as defining a
type
because in graphql a query is a field on
the
type whose name is query and finally
if i want to resolve a query i can
compose the exit with query static
method
plus in parameters the schema the schema
is
an object containing all the types that
i have declared
i'm passing in the query string so the
graphical query and it will return an
array that that
i can cast to json and return to the
client
so this is the the experience
you're getting when you're using webinx
directly
right and the problem with this approach
is that it
actually requires a lot of work
to set up a great graphql api
obviously there are games to use graphql
versus rest
its queries are client-driven
it has introspection you can see the
schema from the client
it has three types which is definitely
one of the
really cool features but if it is too
much of pain to
um to put the api in place
uh well uh it maybe won't be worth it
so what we are going to do is we are
going to use a wrapper library
which is easier to work with to
offset the gains versus the costs
and to make it worthwhile to use
graphical
now if we need to choose a proper
library
well there are basically two kinds of
such libraries there are
schema first libraries and code first
libraries
in the schema first dropper library
basically
your task as a developer will be to
write the
graphql schema and then the job of the
library
will be from the schema to build
to to find a way to link the schema
to the ph key code on the other end if
you are using a code first approach
you will be designing objects and then
the job of the library will be to
generate the schema
from the classes and the objects you've
been
designing so uh
and basically when you are using a
language
that is loosely typed you tend to have
libraries that are schema first if you
are doing javascript you will find a lot
of schemas libraries
on the other end if you are using a
strictly typed language
like java you will find a lot of code
first libraries
php sits a bit in the middle because it
is
optionally tight you can have types but
you're not forced to
and so you have the two kinds of
libraries out there and
uh basically uh in the schema first
part you have uh overblog lighthouse
reality sciler
and the code first category api platform
graphical light
and get bob
let's make a quick zoom on lighthouse
okay so lighthouse
is a schema first library let's see how
it works
lighthouse is built on top of laravel
when you are using lighthouse what we
you are going to do
is you are going to design this
graphql schema
and basically you are going to annotate
this schema with directives okay this is
a directive
this is another directive and
these directives will be used uh by
lighthouse
to bind this schema to the database
model directly
uh basically under the hood lighthouse
is using yellow points
and yellow point is the orm of laravel
so basically if i'm using the
old directive
automatically lighthouse will put
the current user in the mcquery you can
do
quite powerful stuff with only
directives for instance the create
directive here
will create directly an object in
database
when you when you call critpost and it
will put a post directly into the
database and you can do validation
right here on each field
okay so it's very efficient
i mean you can build a complete
graphql api in very few lines of code
with this approach
also it is very very tied to laravel
and to eloquent which is the oram so if
you want
to do advanced things and if you don't
want to
to be too much tied to your database you
will have to write
a custom directive which is a bit of a
pain
but if you have a simple use case and
you only want to
back to to do quick by binding to a
database it is a great tool
okay one thing that is also interesting
it has support for subscriptions
which is uh so you can do real-time
graph you graphql can
can answer in real time which is not
that common in php
so that is lighthouse let's now make
a zoom on api platform so api platform
okay it is a code first library
in api platform the philosophy is the
opposite
you start by writing a php class
and then you're going to put annotations
on the class an api platform will read
the annotation
and generate the graphical schema for
you
okay um api platform was
first built with the rest philosophy in
mind
and uh what is kind of fun with the api
platform is that you can expose
quite easily both a rest api and a
graphql api
very few lines of code so you get both
kind of api
support using the same code
which is cool however
if you want to have a good control on
you the graphical schema that is
generated api platform
may not be the best uh the best
tool out there because the underlying
philosophy
is very much uh rest so you have credit
you have you can create read update and
delete the report
if you want to do some some other things
uh well it will be a bit harder to
customize
it has support for subscriptions too so
yeah so that was the zoom on lighthouse
and
api platform there are many also
libraries out there
and i've been preparing a few schemas
to help you decide what library you can
use
by answering a few questions so let's
jump into that
so basically if you want to pick a
graphical library
i think the first que and if you are
doing php
the first question you should ask is are
you developing
an application or a tool okay
so basically um
if you are
doing uh if you are developing a tool if
your model
is dynamic for instance if uh
you're sorry
if you are developing a cms and the end
user
can create a new content type you can
create new type
add new fields stuff like that then you
want to go for webinars
okay you want to go low level and build
your own tool
on it if you are developing an
application and you have a set of
classes
already well defined then you want to go
for a wrapper library then there is a
question
do you need subscriptions if you want to
do things
in real time then you have to pick
a library that supports subscriptions
there are not many out there
it's lighthouse api platform silo of all
webinars
otherwise you can choose any library
then there is another question which is
do you want
do you want to do do you want to use
relay on your front end if you are
using relay a relay imposes
a number of constraints of the on the
schemas that are generated
and not all the libraries out there have
support for
this kind of schema so if you want to do
to use relay you should definitely aim
for those libraries
maybe lighthouse and graphical bundles
finally depending on the framework you
are using
you will also have to to put to pick
one of those
libraries some libraries
are framework agnostics like webinarics
and graphic lite and you can use them
everywhere alright so
finally the last question do you prefer
a schema first or
a code first approach if you want
to go schema first pick one here
if you want to go code first pick one
here
and when you unsword all those questions
if you are lucky well you still have a
choice between one or two libraries
if you are unlucky there are no
libraries uh
answering you need for instance if you
want uh to do
to use a code first approach in laravel
and using subscriptions well
you can't basically
and but yes this
approach should help you choose uh one
of those libraries
okay and uh i try to be
not too much biased but yes of course i
i altered a graphic light and so well
now we will enter the third phase of
this talk
and i will be doing a quick demo about
graphic light
before doing the demo i will try to
explain you the philosophy
that drove a graphical light basically
my id was uh well let's imagine
you want to do a simple echo query
in php okay
if you want to do such a query
in graphql it will look like this i'm
creating a query type and basically
yes there is a echo it takes a message
it will return um well i
i'm doing an echo to build that
using webonix i would need to put cisco
i already presented it i need to put an
echo field
which returns a string that takes into
argument a string
and and that results by reading the
arguments and returning them
but if i want to write the same echo in
pure php
basically it only takes four lines
basically the function name could map
the query name in graphql the parameters
here could
map graphical arguments and the return
type is already defined
and then the body of the function is
actually my resolver
so what would be really cool
would be what if i was able to simply
put
a query annotation here
and well this query annotation
uh would automatically
tell my library graphically like in my
case
that this function should be actually
a graphical query expose it in graphql
that's it
and so that's the philosophy behind
graphqlite using annotations
and using the fact that php
is already typed and
basically taking php types and mapping
them
automatically to graphical types so
this is graphic light graphicalite is a
mapper between php types
and graphql types and
what is kind of fun is that it actually
plays quite nice with doctrine
okay doctrine is the orm
used by a symphony
and basically in doctrine you put
annotations in your php objects
and doctrine is doing a mapping between
php objects
and database tables and from the php
objects
it can generate the database model and
with graphilite we are doing the same
thing
we are starting from the php object and
we are generating a graphql schema
yeah so let's go for the live coding
quick note i already told it is
framework agnostic
you can use it starting from php 7.2
and it's based on webonix
now for the hard part for me
the demo yeah so we are going
to uh make a quick demo with a
marketplace and basically my marketplace
has companies and in each company
can have several products and we will be
focusing on this relationship between
companies and products
in the last uh in the next five minutes
right so
let's jump to the code here
i already did set up a
graphql a graphical light in
a symphony project the database is
already loaded
and i wrote a company controller okay so
it's actually a controller like like
like you can find some in nbc frameworks
except it is in the graphql controller
namespace
okay and if you want to put queries or
mutations
somewhere in your code you will put them
in a controller
so my controller is fed with a company
repository
the company repository is the object
that will access the database
okay and i have this
method which is called get companies
that takes
a search string and that will query the
database for the string and return the
results
what i'm going to do is i'm going to put
an annotation
here and
i'm going to put a query annotation to
tell graphic life okay
take this company's
[Music]
function and expose it in the graphql
schema
if i go in firefox here i've got a
graphical
test client setup so i'm going to
refresh
the page and oops
okay i'm getting an error let's make
a quick zoom on this error and basically
what graphicality is telling me is that
in the get companies method a type hint
is missing okay you remember
that php is optionally typed but graphql
must have types so when i'm using
graphqlite i must put type
into all my functions uh
all my queries here i did not define
any return type so i need to define one
so
i'm going to say company get companies
is returning an array of companies now i
have a problem
it's that php does not have the notion
of generics so i cannot say something
like okay it's an array of company
this is not valid php right so what i'm
gonna do
is i'm going to put an uh
a code a command in the php doc and
in the php dock i can put anything and
especially
i will give a type hint to uh
to graph the light and tell him that
this array is actually
an array of companies so let's go back
to firefox refresh the page
and oh i'm getting another error
okay let's zoom on this lever
it's error driven development i'm a big
fan of ever
driven development it works really well
no i and i actually tried to
make sure that all the error messages
are quite clear
it's really important and well
in your own code try uh to pay attention
on the other messages you are generating
you are doing
your future self favor uh yeah
so basically it's telling me that in get
companies
it cannot map the class company to a
known required type
what graduality is actually tell me
telling me is that i did not tell
him explicitly that company
is a graphical type and so to do that
i simply add an annotation which is the
type annotation
and the type annotation is
telling graphical life okay map this
class to a tie
of course a type must have some face so
i'm going to
put annotations in the in the gators
here and i'm going to say okay expose
id as a fill and name
as a field and maybe website
as a field too also notice that i'm
putting
the field annotation on getters i'm not
putting the annotation
on the properties the properties are are
private so i cannot access them directly
doctrine has annotation on properties
because
it is doing some black magic and
actually
accessing directly private properties
i'm not doing that in graphic light
okay so yes i must put the fill
annotation on the getters
so let's go back to
graphical i'm refreshing the page
i don't have any error so it looks good
and if i'm looking at writing a query
i can my company pool will just appear
and yeah i can do a search on any
companies containing the a
and i'm going to display the id and the
name
place the request and it is working and
if i'm
adding the website right
good so basically you can see that i
managed to create
a graphql api by basically adding three
annotations
query type and fill which is pretty cool
um and yeah
let's so far i only fetched
fields from companies so let's do some
binding with a product
so i'm going to go in the get products
getter and i'm gonna add a field on it
i'm gonna refresh the page
and i'm getting another evolve if i'm
zooming on this error
it is telling me that it cannot map the
product class
to a known graphical type okay we
already saw
this error two minutes ago so i'm pretty
sure you know what i should do i should
go in the product class
and instruct graphicalize that the
product
class is also a tie
and so i'm putting a type here and i'm
going to
put a field annotation
on the id on the name
on the price on the margin of the
product and
if i'm refreshing the page
yeah everything seems to be going great
and i can access the products
and access the id and the name of the
product
and it's working yeah
so that's it and basically
my job when i set up a graphql api
becomes adding a few annotations and
yeah
that's it
so yeah for the live demo
i won't be going any further i will be
presenting you very quickly a few
additional
features for instance if you want to put
to create a mutation you have a mutation
annotation
that can be used to create a mutation it
works exactly the same as
the query annotation works
there is a brilliant support for
authentication and authorization
that is plugged into your favorite
framework
laravel symphony whatever but basically
if you are using the right annotation
and passing the name of a write
well then this query will be
visible only if the user that is
currently logged
has this right you can also use the
right annotation and feels directly
you can even do fine-grained
authorization
if you want to say that some objects can
be seen but not others
in this example i've got an email field
from a user and basically i am saying
that i am looking at the component of
the
the user of the current user
and comparing it with the company of the
user that is logged
user here refers to the user that is
currently loaded
and basically this is saying i can see
the email of the people that are
in the same company as me i can see the
email of my colleagues
but i cannot see the email of someone
that is
not my colleague so with this security
annotation
we can have something that is going
quite deep
to do fine-grained authorization
another feature i like a lot is auto
wiring
uh basically here we are in a domain
object a product and uh
let's admit i want to compute the v80 of
a product
computing the v80 of a product can be
quite complicated
maybe i need to know uh the type of the
product the country the
uh the user is in so it can be difficult
and we typically won't do it in the
domain object but rather
rather we will call a service but you
when you are in a domain object
accessing services accessing services is
difficult and what we can do here is
auto wire called the auto wire ring and
basically graphic light will
automatically
inject when i'm calling the v80 field it
will automatically inject
from the dependency injection container
the service
the v80 service and i can use it
directly in the resolver here
so it enables me to access services and
from a domain object by passing those
services
in parameters of the resolver which is
kind of
kind of cool yeah there are many many
more features
available uh we have support for
validation
uh for uh indium types even if they
don't
exist in php file uploads um
what i invite you to do if you are
interested
in trying out graphqlite is
having a look at the documentation
everything is i hope clearly documented
and if you have any issue well you can
always
contact me either on
twitter directly or if you prefer
uh just open an issue
on the graphqlite repository yeah
so yeah that's repetitive let's wrap uh
this um this talk uh
basically uh doing graphql in php is
definitely possible
you have many possibilities out there uh
and this is
since graphql is pretty cool uh
well i definitely invite you to to try
it out
and uh that's it do you have any
questions
thanks so much david it was such
incredible talk
i really enjoyed it all the life current
day we were scared
yeah everything was incredible so that's
great uh so yeah
do yeah we have a question yes
uh so florian he's asking about
if graph graphic graph live
is is gonna support or is currently
supporting subscriptions
it is not currently supporting
subscriptions
i plan to add support for subscriptions
in the future maybe
not in the in the two coming months
because i want to
to release a version 4.1 of graphqlite
and i'm no subscriptions won't be part
of this release
but yes i would like to to work on that
for the end of the year definitely
definitely well that
that's that sounds super exciting i
guess and
i think i have another question because
i found
out super super interesting so i'd like
to understand like
like why do you why did you decide to
go and build this incredible technology
and what are kind of like the future
plans for for it
oh okay uh um
well when i started uh writing
graphically light it was
two years ago and basically you had only
two options at the time it was using
webonix directly
or uh using um
[Music]
using ushido which is a library that has
been abandoned
and basically they were really low level
libraries and they were hard to use
and i have this huge project for a
client of mine
uh we are just at the coding machine we
are doing mostly internet and extranet
applications and a client of mine
uh had uh this huge rest api
with a lot of end points and maybe read
on the end points
i wanted to do graphql because i knew
that
the flexibility of graph create would be
really really beneficial
for that client and uh the only option i
had was webonix which was
too hard to use uh and so i decided
i started writing a small library which
became a bit more complex
and uh i did two three versions of the
library and then i
i told myself okay uh i i must work on
it
really seriously put it on um
open source it and well that's how
graphic light
was born actually well that sounds that
sounds
so great and i think like thanks so much
for
contributing with the graphql community
in this case in the php because
yeah i think there are not so many
people that either they don't know that
they are able to do these or they
figure out they like realize that it's a
bit more difficult so it's even like a
start you know like to contribute so
i i i think like like like this is super
super super interested and i think like
a if the people they do know this
library they are going to start to use
it
they are going to like it and they are
going to like adopting their company so
um yeah thanks so much for sharing this
knowledge with us
you're welcome yeah
yeah thanks so much for like like like
like contacting us to
speak uh because it's it's been
difficult to find
kind of like people that they have
companies in hong kong although you are
not in hong kong right now but i
you're like really connected to the hong
kong community so
i am so so glad to have you here and
thanks so much and
i really really hope to see you soon
thank you very much okay david thanks
so up next so