0:00:00.560,0:00:03.360 thank you very much okay so let's get 0:00:02.480,0:00:06.480 started 0:00:03.360,0:00:09.599 so i already introduced my talk uh 0:00:06.480,0:00:12.960 i'm gonna share my screen here 0:00:09.599,0:00:13.679 and yeah so basically there will be 0:00:12.960,0:00:15.920 three parts 0:00:13.679,0:00:19.279 in this talk the first part is about the 0:00:15.920,0:00:21.520 ecosystem the graphql ecosystem in php 0:00:19.279,0:00:23.199 it does exist and it is actually quite 0:00:21.520,0:00:26.240 large 0:00:23.199,0:00:27.359 then how to choose the right library for 0:00:26.240,0:00:29.920 your project 0:00:27.359,0:00:30.480 if you're doing some php and finally a 0:00:29.920,0:00:33.520 demo 0:00:30.480,0:00:36.719 of graphqlite 0:00:33.520,0:00:40.079 so um about the ecosystem 0:00:36.719,0:00:42.000 well i'm sure all of you already know 0:00:40.079,0:00:44.239 that when you're doing graphql you need 0:00:42.000,0:00:45.600 a graphql client in the browser and a 0:00:44.239,0:00:48.320 graphql middleware 0:00:45.600,0:00:49.360 on the server side and you have actually 0:00:48.320,0:00:52.480 implemented 0:00:49.360,0:00:56.399 implementations of graphql middlewares 0:00:52.480,0:00:59.039 in all in many languages 0:00:56.399,0:01:00.000 of course not js it started there but 0:00:59.039,0:01:03.039 also php 0:01:00.000,0:01:06.320 java c-sharp or whatever 0:01:03.039,0:01:10.080 today we're going to be zooming on php 0:01:06.320,0:01:12.560 and if we have a look at the php 0:01:10.080,0:01:13.360 graphical middlewares there are actually 0:01:12.560,0:01:16.640 two kinds 0:01:13.360,0:01:17.600 of uh such middlewares and i will split 0:01:16.640,0:01:20.880 them 0:01:17.600,0:01:23.920 a bit arbitrarily arbitrarily in two 0:01:20.880,0:01:24.799 uh sections ones that i call core 0:01:23.920,0:01:26.479 libraries 0:01:24.799,0:01:27.920 and another that i call dropper 0:01:26.479,0:01:30.880 libraries and 0:01:27.920,0:01:31.439 core libraries are actually middlewares 0:01:30.880,0:01:34.880 that are 0:01:31.439,0:01:39.360 quite low level they are used to parse 0:01:34.880,0:01:42.560 the graphical queries to serve 0:01:39.360,0:01:45.280 the the the response in json 0:01:42.560,0:01:45.920 they are really powerful but they are 0:01:45.280,0:01:48.320 kind of 0:01:45.920,0:01:50.000 hard to use the the developer the 0:01:48.320,0:01:53.119 developer experience 0:01:50.000,0:01:55.680 to use such uh library is 0:01:53.119,0:01:56.479 kind of poor they're hard to use and so 0:01:55.680,0:01:59.759 on top 0:01:56.479,0:02:01.840 of those core libraries people build 0:01:59.759,0:02:03.920 wrapper libraries which are actually 0:02:01.840,0:02:06.399 libraries that use core libraries 0:02:03.920,0:02:07.520 and that are more high level more 0:02:06.399,0:02:10.160 opinionated 0:02:07.520,0:02:12.720 certainly easier to use maybe not that 0:02:10.160,0:02:15.200 not as much powerful as the call library 0:02:12.720,0:02:16.400 but basically most of the time when you 0:02:15.200,0:02:18.480 are doing an application 0:02:16.400,0:02:20.640 you will be choosing a verbal diagram 0:02:18.480,0:02:23.040 right 0:02:20.640,0:02:24.239 in php if we have a look at core 0:02:23.040,0:02:26.160 libraries 0:02:24.239,0:02:28.160 there are not that many of them there 0:02:26.160,0:02:31.360 are actually two right now 0:02:28.160,0:02:33.120 there is webinaics which is the de facto 0:02:31.360,0:02:35.760 standard in php 0:02:33.120,0:02:38.160 almost everybody is using webinx and 0:02:35.760,0:02:41.840 then there is a newcomer that is called 0:02:38.160,0:02:44.640 ray welty which is developed by 0:02:41.840,0:02:45.360 some russian guys it's an active 0:02:44.640,0:02:48.640 development 0:02:45.360,0:02:50.879 it looks really promising there is no 0:02:48.640,0:02:54.560 solid documentation yet 0:02:50.879,0:02:56.800 so uh right now if you 0:02:54.560,0:02:57.760 need a co-library definitely go to 0:02:56.800,0:03:00.959 webonix 0:02:57.760,0:03:04.480 but keep an eye and high on 0:03:00.959,0:03:06.879 railway there was in the past 0:03:04.480,0:03:07.920 more libraries here there was one was 0:03:06.879,0:03:10.879 that was called 0:03:07.920,0:03:12.400 ushido that has been abandoned in favor 0:03:10.879,0:03:14.239 of weaponix so 0:03:12.400,0:03:16.480 right now it's pretty much robotics if 0:03:14.239,0:03:19.840 you want a core library 0:03:16.480,0:03:21.599 and then on top of this core library 0:03:19.840,0:03:22.959 there are wrapper libraries and there 0:03:21.599,0:03:26.239 are many of them 0:03:22.959,0:03:28.879 and today uh 0:03:26.239,0:03:29.760 all those libraries are using webonix 0:03:28.879,0:03:32.239 under the hood 0:03:29.760,0:03:35.200 okay it's a wrapper around webonix to 0:03:32.239,0:03:38.480 make it easier to use 0:03:35.200,0:03:40.879 so basically we have api platform and 0:03:38.480,0:03:41.760 the overblock graphql bundles that are 0:03:40.879,0:03:44.319 really 0:03:41.760,0:03:46.400 used with the symphony framework if 0:03:44.319,0:03:48.400 you're doing laravel you can use 0:03:46.400,0:03:50.720 a library called lighthouse i will be 0:03:48.400,0:03:52.300 presenting those a bit later 0:03:50.720,0:03:54.080 if you're doing um 0:03:52.300,0:03:56.959 [Music] 0:03:54.080,0:03:59.280 what uh if you're using a cms like 0:03:56.959,0:04:02.319 wordpress or drupal 0:03:59.280,0:04:05.680 wordpress and drupal have modules 0:04:02.319,0:04:08.879 to plug to present a graphql api 0:04:05.680,0:04:10.560 so if you want to do a headless cms it's 0:04:08.879,0:04:14.159 quite easy using 0:04:10.560,0:04:16.880 wordpress or drupal and adding a 0:04:14.159,0:04:17.759 a graphql module on them and then there 0:04:16.880,0:04:19.440 is graphqlite 0:04:17.759,0:04:21.199 which i've been altering for the last 0:04:19.440,0:04:23.840 two years and which is 0:04:21.199,0:04:24.240 a framework agnostic because you can use 0:04:23.840,0:04:29.360 it 0:04:24.240,0:04:32.320 whatever the framework you use 0:04:29.360,0:04:32.720 let's make a quick look uh a quick zoom 0:04:32.320,0:04:35.759 on 0:04:32.720,0:04:37.520 webonix okay so webonix it is the core 0:04:35.759,0:04:40.880 library here 0:04:37.520,0:04:42.240 and how does it look like coding with 0:04:40.880,0:04:45.360 webox well 0:04:42.240,0:04:48.240 here i've got a graphql type okay 0:04:45.360,0:04:48.639 and basically this type is a story it 0:04:48.240,0:04:52.639 has 0:04:48.639,0:04:55.680 fields with which all have types 0:04:52.639,0:04:56.240 building that in webmix the card would 0:04:55.680,0:04:59.280 look 0:04:56.240,0:05:01.120 like this okay it's kind of verbose 0:04:59.280,0:05:02.639 and as i told you the developer 0:05:01.120,0:05:04.000 experience is not that great but 0:05:02.639,0:05:08.240 basically 0:05:04.000,0:05:11.840 i'm creating a type it's its name is 0:05:08.240,0:05:14.880 history here and i've got a number of 0:05:11.840,0:05:17.120 fields that are declared here with the 0:05:14.880,0:05:19.280 type of the field the description 0:05:17.120,0:05:20.800 if i've got arguments the arguments are 0:05:19.280,0:05:23.120 declared here 0:05:20.800,0:05:24.160 and finally i have a resolver that will 0:05:23.120,0:05:26.639 be called 0:05:24.160,0:05:27.360 when i query this fill the resolver is 0:05:26.639,0:05:30.479 called 0:05:27.360,0:05:33.919 to fetch the data 0:05:30.479,0:05:33.919 this is really verbals right 0:05:34.320,0:05:42.479 and also it might look a bit like 0:05:39.280,0:05:44.720 some libraries some graphql libraries in 0:05:42.479,0:05:46.080 javascript especially if you have been 0:05:44.720,0:05:49.680 doing 0:05:46.080,0:05:52.800 been using express graphql 0:05:49.680,0:05:56.240 webonix started by mimicking a lot what 0:05:52.800,0:05:59.440 facebook was doing in its own javascript 0:05:56.240,0:06:03.120 library if i want to declare 0:05:59.440,0:06:05.919 a query well i'm creating a type query 0:06:03.120,0:06:07.600 whose fields are here it's actually 0:06:05.919,0:06:08.000 exactly the same thing as defining a 0:06:07.600,0:06:10.880 type 0:06:08.000,0:06:11.440 because in graphql a query is a field on 0:06:10.880,0:06:15.759 the 0:06:11.440,0:06:18.000 type whose name is query and finally 0:06:15.759,0:06:20.000 if i want to resolve a query i can 0:06:18.000,0:06:20.800 compose the exit with query static 0:06:20.000,0:06:23.440 method 0:06:20.800,0:06:24.560 plus in parameters the schema the schema 0:06:23.440,0:06:26.639 is 0:06:24.560,0:06:28.080 an object containing all the types that 0:06:26.639,0:06:31.039 i have declared 0:06:28.080,0:06:32.880 i'm passing in the query string so the 0:06:31.039,0:06:34.160 graphical query and it will return an 0:06:32.880,0:06:37.840 array that that 0:06:34.160,0:06:38.960 i can cast to json and return to the 0:06:37.840,0:06:43.039 client 0:06:38.960,0:06:45.440 so this is the the experience 0:06:43.039,0:06:46.240 you're getting when you're using webinx 0:06:45.440,0:06:49.599 directly 0:06:46.240,0:06:50.479 right and the problem with this approach 0:06:49.599,0:06:53.919 is that it 0:06:50.479,0:06:57.759 actually requires a lot of work 0:06:53.919,0:07:00.720 to set up a great graphql api 0:06:57.759,0:07:01.759 obviously there are games to use graphql 0:07:00.720,0:07:05.120 versus rest 0:07:01.759,0:07:08.560 its queries are client-driven 0:07:05.120,0:07:10.080 it has introspection you can see the 0:07:08.560,0:07:12.639 schema from the client 0:07:10.080,0:07:13.280 it has three types which is definitely 0:07:12.639,0:07:15.840 one of the 0:07:13.280,0:07:17.039 really cool features but if it is too 0:07:15.840,0:07:20.880 much of pain to 0:07:17.039,0:07:24.400 um to put the api in place 0:07:20.880,0:07:26.880 uh well uh it maybe won't be worth it 0:07:24.400,0:07:28.639 so what we are going to do is we are 0:07:26.880,0:07:32.479 going to use a wrapper library 0:07:28.639,0:07:36.560 which is easier to work with to 0:07:32.479,0:07:39.759 offset the gains versus the costs 0:07:36.560,0:07:42.319 and to make it worthwhile to use 0:07:39.759,0:07:42.319 graphical 0:07:42.639,0:07:46.639 now if we need to choose a proper 0:07:45.280,0:07:50.000 library 0:07:46.639,0:07:53.599 well there are basically two kinds of 0:07:50.000,0:07:56.840 such libraries there are 0:07:53.599,0:07:58.080 schema first libraries and code first 0:07:56.840,0:08:00.960 libraries 0:07:58.080,0:08:02.560 in the schema first dropper library 0:08:00.960,0:08:04.879 basically 0:08:02.560,0:08:06.080 your task as a developer will be to 0:08:04.879,0:08:09.520 write the 0:08:06.080,0:08:10.240 graphql schema and then the job of the 0:08:09.520,0:08:13.599 library 0:08:10.240,0:08:16.800 will be from the schema to build 0:08:13.599,0:08:19.759 to to find a way to link the schema 0:08:16.800,0:08:22.160 to the ph key code on the other end if 0:08:19.759,0:08:25.440 you are using a code first approach 0:08:22.160,0:08:28.240 you will be designing objects and then 0:08:25.440,0:08:29.840 the job of the library will be to 0:08:28.240,0:08:31.840 generate the schema 0:08:29.840,0:08:34.080 from the classes and the objects you've 0:08:31.840,0:08:37.279 been 0:08:34.080,0:08:40.320 designing so uh 0:08:37.279,0:08:41.120 and basically when you are using a 0:08:40.320,0:08:45.519 language 0:08:41.120,0:08:48.480 that is loosely typed you tend to have 0:08:45.519,0:08:50.399 libraries that are schema first if you 0:08:48.480,0:08:52.240 are doing javascript you will find a lot 0:08:50.399,0:08:54.720 of schemas libraries 0:08:52.240,0:08:56.320 on the other end if you are using a 0:08:54.720,0:08:58.720 strictly typed language 0:08:56.320,0:09:00.800 like java you will find a lot of code 0:08:58.720,0:09:03.839 first libraries 0:09:00.800,0:09:04.080 php sits a bit in the middle because it 0:09:03.839,0:09:06.320 is 0:09:04.080,0:09:07.600 optionally tight you can have types but 0:09:06.320,0:09:09.040 you're not forced to 0:09:07.600,0:09:10.959 and so you have the two kinds of 0:09:09.040,0:09:14.160 libraries out there and 0:09:10.959,0:09:16.880 uh basically uh in the schema first 0:09:14.160,0:09:18.160 part you have uh overblog lighthouse 0:09:16.880,0:09:21.519 reality sciler 0:09:18.160,0:09:22.320 and the code first category api platform 0:09:21.519,0:09:26.160 graphical light 0:09:22.320,0:09:26.160 and get bob 0:09:26.880,0:09:30.800 let's make a quick zoom on lighthouse 0:09:29.519,0:09:33.680 okay so lighthouse 0:09:30.800,0:09:36.320 is a schema first library let's see how 0:09:33.680,0:09:41.040 it works 0:09:36.320,0:09:43.440 lighthouse is built on top of laravel 0:09:41.040,0:09:44.640 when you are using lighthouse what we 0:09:43.440,0:09:47.839 you are going to do 0:09:44.640,0:09:50.880 is you are going to design this 0:09:47.839,0:09:54.399 graphql schema 0:09:50.880,0:09:57.680 and basically you are going to annotate 0:09:54.399,0:09:58.800 this schema with directives okay this is 0:09:57.680,0:10:02.480 a directive 0:09:58.800,0:10:05.360 this is another directive and 0:10:02.480,0:10:06.560 these directives will be used uh by 0:10:05.360,0:10:10.079 lighthouse 0:10:06.560,0:10:12.399 to bind this schema to the database 0:10:10.079,0:10:15.120 model directly 0:10:12.399,0:10:16.560 uh basically under the hood lighthouse 0:10:15.120,0:10:19.519 is using yellow points 0:10:16.560,0:10:21.440 and yellow point is the orm of laravel 0:10:19.519,0:10:24.480 so basically if i'm using the 0:10:21.440,0:10:28.640 old directive 0:10:24.480,0:10:32.240 automatically lighthouse will put 0:10:28.640,0:10:32.800 the current user in the mcquery you can 0:10:32.240,0:10:34.800 do 0:10:32.800,0:10:36.640 quite powerful stuff with only 0:10:34.800,0:10:38.160 directives for instance the create 0:10:36.640,0:10:41.040 directive here 0:10:38.160,0:10:42.480 will create directly an object in 0:10:41.040,0:10:44.959 database 0:10:42.480,0:10:46.880 when you when you call critpost and it 0:10:44.959,0:10:49.519 will put a post directly into the 0:10:46.880,0:10:52.959 database and you can do validation 0:10:49.519,0:10:52.959 right here on each field 0:10:53.440,0:11:01.120 okay so it's very efficient 0:10:57.839,0:11:04.640 i mean you can build a complete 0:11:01.120,0:11:06.640 graphql api in very few lines of code 0:11:04.640,0:11:10.240 with this approach 0:11:06.640,0:11:13.600 also it is very very tied to laravel 0:11:10.240,0:11:14.000 and to eloquent which is the oram so if 0:11:13.600,0:11:17.440 you want 0:11:14.000,0:11:18.880 to do advanced things and if you don't 0:11:17.440,0:11:21.440 want to 0:11:18.880,0:11:22.399 to be too much tied to your database you 0:11:21.440,0:11:25.200 will have to write 0:11:22.399,0:11:26.399 a custom directive which is a bit of a 0:11:25.200,0:11:28.480 pain 0:11:26.399,0:11:29.839 but if you have a simple use case and 0:11:28.480,0:11:31.920 you only want to 0:11:29.839,0:11:33.920 back to to do quick by binding to a 0:11:31.920,0:11:36.399 database it is a great tool 0:11:33.920,0:11:38.640 okay one thing that is also interesting 0:11:36.399,0:11:43.519 it has support for subscriptions 0:11:38.640,0:11:46.880 which is uh so you can do real-time 0:11:43.519,0:11:48.800 graph you graphql can 0:11:46.880,0:11:51.839 can answer in real time which is not 0:11:48.800,0:11:54.880 that common in php 0:11:51.839,0:11:58.160 so that is lighthouse let's now make 0:11:54.880,0:12:01.440 a zoom on api platform so api platform 0:11:58.160,0:12:03.920 okay it is a code first library 0:12:01.440,0:12:05.040 in api platform the philosophy is the 0:12:03.920,0:12:08.480 opposite 0:12:05.040,0:12:11.760 you start by writing a php class 0:12:08.480,0:12:15.279 and then you're going to put annotations 0:12:11.760,0:12:16.079 on the class an api platform will read 0:12:15.279,0:12:18.880 the annotation 0:12:16.079,0:12:19.920 and generate the graphical schema for 0:12:18.880,0:12:23.360 you 0:12:19.920,0:12:25.760 okay um api platform was 0:12:23.360,0:12:26.800 first built with the rest philosophy in 0:12:25.760,0:12:29.360 mind 0:12:26.800,0:12:31.279 and uh what is kind of fun with the api 0:12:29.360,0:12:34.079 platform is that you can expose 0:12:31.279,0:12:35.600 quite easily both a rest api and a 0:12:34.079,0:12:38.160 graphql api 0:12:35.600,0:12:41.040 very few lines of code so you get both 0:12:38.160,0:12:41.040 kind of api 0:12:41.440,0:12:48.240 support using the same code 0:12:44.639,0:12:52.240 which is cool however 0:12:48.240,0:12:54.079 if you want to have a good control on 0:12:52.240,0:12:56.079 you the graphical schema that is 0:12:54.079,0:12:59.200 generated api platform 0:12:56.079,0:13:01.839 may not be the best uh the best 0:12:59.200,0:13:02.560 tool out there because the underlying 0:13:01.839,0:13:05.360 philosophy 0:13:02.560,0:13:07.279 is very much uh rest so you have credit 0:13:05.360,0:13:08.639 you have you can create read update and 0:13:07.279,0:13:12.560 delete the report 0:13:08.639,0:13:16.240 if you want to do some some other things 0:13:12.560,0:13:17.760 uh well it will be a bit harder to 0:13:16.240,0:13:21.440 customize 0:13:17.760,0:13:24.399 it has support for subscriptions too so 0:13:21.440,0:13:24.639 yeah so that was the zoom on lighthouse 0:13:24.399,0:13:26.720 and 0:13:24.639,0:13:28.240 api platform there are many also 0:13:26.720,0:13:31.760 libraries out there 0:13:28.240,0:13:34.079 and i've been preparing a few schemas 0:13:31.760,0:13:34.880 to help you decide what library you can 0:13:34.079,0:13:37.360 use 0:13:34.880,0:13:40.160 by answering a few questions so let's 0:13:37.360,0:13:40.160 jump into that 0:13:40.560,0:13:44.000 so basically if you want to pick a 0:13:42.800,0:13:46.399 graphical library 0:13:44.000,0:13:48.560 i think the first que and if you are 0:13:46.399,0:13:51.519 doing php 0:13:48.560,0:13:52.399 the first question you should ask is are 0:13:51.519,0:13:55.680 you developing 0:13:52.399,0:13:59.040 an application or a tool okay 0:13:55.680,0:14:02.560 so basically um 0:13:59.040,0:14:05.760 if you are 0:14:02.560,0:14:06.399 doing uh if you are developing a tool if 0:14:05.760,0:14:09.600 your model 0:14:06.399,0:14:14.320 is dynamic for instance if uh 0:14:09.600,0:14:16.720 you're sorry 0:14:14.320,0:14:17.519 if you are developing a cms and the end 0:14:16.720,0:14:20.000 user 0:14:17.519,0:14:20.959 can create a new content type you can 0:14:20.000,0:14:23.199 create new type 0:14:20.959,0:14:24.720 add new fields stuff like that then you 0:14:23.199,0:14:26.959 want to go for webinars 0:14:24.720,0:14:28.000 okay you want to go low level and build 0:14:26.959,0:14:29.920 your own tool 0:14:28.000,0:14:31.279 on it if you are developing an 0:14:29.920,0:14:31.760 application and you have a set of 0:14:31.279,0:14:35.120 classes 0:14:31.760,0:14:38.160 already well defined then you want to go 0:14:35.120,0:14:38.720 for a wrapper library then there is a 0:14:38.160,0:14:41.760 question 0:14:38.720,0:14:42.399 do you need subscriptions if you want to 0:14:41.760,0:14:45.519 do things 0:14:42.399,0:14:47.680 in real time then you have to pick 0:14:45.519,0:14:48.959 a library that supports subscriptions 0:14:47.680,0:14:51.360 there are not many out there 0:14:48.959,0:14:52.399 it's lighthouse api platform silo of all 0:14:51.360,0:14:55.519 webinars 0:14:52.399,0:14:58.160 otherwise you can choose any library 0:14:55.519,0:14:59.040 then there is another question which is 0:14:58.160,0:15:02.880 do you want 0:14:59.040,0:15:06.079 do you want to do do you want to use 0:15:02.880,0:15:09.279 relay on your front end if you are 0:15:06.079,0:15:11.600 using relay a relay imposes 0:15:09.279,0:15:13.760 a number of constraints of the on the 0:15:11.600,0:15:16.399 schemas that are generated 0:15:13.760,0:15:17.199 and not all the libraries out there have 0:15:16.399,0:15:20.720 support for 0:15:17.199,0:15:23.279 this kind of schema so if you want to do 0:15:20.720,0:15:24.720 to use relay you should definitely aim 0:15:23.279,0:15:28.639 for those libraries 0:15:24.720,0:15:31.040 maybe lighthouse and graphical bundles 0:15:28.639,0:15:32.000 finally depending on the framework you 0:15:31.040,0:15:35.440 are using 0:15:32.000,0:15:38.839 you will also have to to put to pick 0:15:35.440,0:15:42.320 one of those 0:15:38.839,0:15:45.279 libraries some libraries 0:15:42.320,0:15:46.880 are framework agnostics like webinarics 0:15:45.279,0:15:50.720 and graphic lite and you can use them 0:15:46.880,0:15:54.480 everywhere alright so 0:15:50.720,0:15:56.079 finally the last question do you prefer 0:15:54.480,0:15:59.360 a schema first or 0:15:56.079,0:16:02.480 a code first approach if you want 0:15:59.360,0:16:04.800 to go schema first pick one here 0:16:02.480,0:16:05.759 if you want to go code first pick one 0:16:04.800,0:16:09.040 here 0:16:05.759,0:16:11.600 and when you unsword all those questions 0:16:09.040,0:16:14.160 if you are lucky well you still have a 0:16:11.600,0:16:16.000 choice between one or two libraries 0:16:14.160,0:16:17.759 if you are unlucky there are no 0:16:16.000,0:16:20.240 libraries uh 0:16:17.759,0:16:22.240 answering you need for instance if you 0:16:20.240,0:16:26.639 want uh to do 0:16:22.240,0:16:29.759 to use a code first approach in laravel 0:16:26.639,0:16:33.279 and using subscriptions well 0:16:29.759,0:16:36.560 you can't basically 0:16:33.279,0:16:39.440 and but yes this 0:16:36.560,0:16:41.120 approach should help you choose uh one 0:16:39.440,0:16:44.240 of those libraries 0:16:41.120,0:16:47.839 okay and uh i try to be 0:16:44.240,0:16:52.079 not too much biased but yes of course i 0:16:47.839,0:16:54.800 i altered a graphic light and so well 0:16:52.079,0:16:55.519 now we will enter the third phase of 0:16:54.800,0:16:58.320 this talk 0:16:55.519,0:16:59.759 and i will be doing a quick demo about 0:16:58.320,0:17:03.040 graphic light 0:16:59.759,0:17:04.799 before doing the demo i will try to 0:17:03.040,0:17:08.079 explain you the philosophy 0:17:04.799,0:17:11.839 that drove a graphical light basically 0:17:08.079,0:17:15.760 my id was uh well let's imagine 0:17:11.839,0:17:18.959 you want to do a simple echo query 0:17:15.760,0:17:22.079 in php okay 0:17:18.959,0:17:26.240 if you want to do such a query 0:17:22.079,0:17:29.679 in graphql it will look like this i'm 0:17:26.240,0:17:33.520 creating a query type and basically 0:17:29.679,0:17:37.919 yes there is a echo it takes a message 0:17:33.520,0:17:41.120 it will return um well i 0:17:37.919,0:17:44.880 i'm doing an echo to build that 0:17:41.120,0:17:47.520 using webonix i would need to put cisco 0:17:44.880,0:17:48.480 i already presented it i need to put an 0:17:47.520,0:17:50.480 echo field 0:17:48.480,0:17:51.919 which returns a string that takes into 0:17:50.480,0:17:54.240 argument a string 0:17:51.919,0:17:57.200 and and that results by reading the 0:17:54.240,0:18:00.240 arguments and returning them 0:17:57.200,0:18:01.600 but if i want to write the same echo in 0:18:00.240,0:18:06.400 pure php 0:18:01.600,0:18:09.840 basically it only takes four lines 0:18:06.400,0:18:13.520 basically the function name could map 0:18:09.840,0:18:16.640 the query name in graphql the parameters 0:18:13.520,0:18:19.200 here could 0:18:16.640,0:18:20.880 map graphical arguments and the return 0:18:19.200,0:18:22.640 type is already defined 0:18:20.880,0:18:24.799 and then the body of the function is 0:18:22.640,0:18:28.400 actually my resolver 0:18:24.799,0:18:31.200 so what would be really cool 0:18:28.400,0:18:32.000 would be what if i was able to simply 0:18:31.200,0:18:35.200 put 0:18:32.000,0:18:39.120 a query annotation here 0:18:35.200,0:18:42.880 and well this query annotation 0:18:39.120,0:18:46.000 uh would automatically 0:18:42.880,0:18:46.480 tell my library graphically like in my 0:18:46.000,0:18:50.000 case 0:18:46.480,0:18:52.160 that this function should be actually 0:18:50.000,0:18:53.360 a graphical query expose it in graphql 0:18:52.160,0:18:56.320 that's it 0:18:53.360,0:18:58.720 and so that's the philosophy behind 0:18:56.320,0:19:02.240 graphqlite using annotations 0:18:58.720,0:19:06.160 and using the fact that php 0:19:02.240,0:19:09.440 is already typed and 0:19:06.160,0:19:10.160 basically taking php types and mapping 0:19:09.440,0:19:13.200 them 0:19:10.160,0:19:15.120 automatically to graphical types so 0:19:13.200,0:19:17.440 this is graphic light graphicalite is a 0:19:15.120,0:19:20.960 mapper between php types 0:19:17.440,0:19:23.679 and graphql types and 0:19:20.960,0:19:25.679 what is kind of fun is that it actually 0:19:23.679,0:19:29.120 plays quite nice with doctrine 0:19:25.679,0:19:32.240 okay doctrine is the orm 0:19:29.120,0:19:34.480 used by a symphony 0:19:32.240,0:19:37.120 and basically in doctrine you put 0:19:34.480,0:19:40.080 annotations in your php objects 0:19:37.120,0:19:41.280 and doctrine is doing a mapping between 0:19:40.080,0:19:44.000 php objects 0:19:41.280,0:19:44.720 and database tables and from the php 0:19:44.000,0:19:47.520 objects 0:19:44.720,0:19:49.200 it can generate the database model and 0:19:47.520,0:19:49.600 with graphilite we are doing the same 0:19:49.200,0:19:52.720 thing 0:19:49.600,0:19:56.559 we are starting from the php object and 0:19:52.720,0:19:56.559 we are generating a graphql schema 0:19:57.280,0:20:03.760 yeah so let's go for the live coding 0:20:01.840,0:20:05.679 quick note i already told it is 0:20:03.760,0:20:08.960 framework agnostic 0:20:05.679,0:20:12.240 you can use it starting from php 7.2 0:20:08.960,0:20:12.240 and it's based on webonix 0:20:13.440,0:20:20.960 now for the hard part for me 0:20:17.039,0:20:23.679 the demo yeah so we are going 0:20:20.960,0:20:26.559 to uh make a quick demo with a 0:20:23.679,0:20:29.760 marketplace and basically my marketplace 0:20:26.559,0:20:33.200 has companies and in each company 0:20:29.760,0:20:36.159 can have several products and we will be 0:20:33.200,0:20:37.520 focusing on this relationship between 0:20:36.159,0:20:40.720 companies and products 0:20:37.520,0:20:44.000 in the last uh in the next five minutes 0:20:40.720,0:20:48.480 right so 0:20:44.000,0:20:52.559 let's jump to the code here 0:20:48.480,0:20:55.760 i already did set up a 0:20:52.559,0:20:58.080 graphql a graphical light in 0:20:55.760,0:20:59.360 a symphony project the database is 0:20:58.080,0:21:03.520 already loaded 0:20:59.360,0:21:06.640 and i wrote a company controller okay so 0:21:03.520,0:21:10.720 it's actually a controller like like 0:21:06.640,0:21:13.600 like you can find some in nbc frameworks 0:21:10.720,0:21:14.240 except it is in the graphql controller 0:21:13.600,0:21:16.640 namespace 0:21:14.240,0:21:18.000 okay and if you want to put queries or 0:21:16.640,0:21:19.840 mutations 0:21:18.000,0:21:21.440 somewhere in your code you will put them 0:21:19.840,0:21:23.760 in a controller 0:21:21.440,0:21:24.799 so my controller is fed with a company 0:21:23.760,0:21:27.440 repository 0:21:24.799,0:21:28.960 the company repository is the object 0:21:27.440,0:21:33.200 that will access the database 0:21:28.960,0:21:35.120 okay and i have this 0:21:33.200,0:21:36.559 method which is called get companies 0:21:35.120,0:21:39.039 that takes 0:21:36.559,0:21:40.880 a search string and that will query the 0:21:39.039,0:21:42.080 database for the string and return the 0:21:40.880,0:21:44.559 results 0:21:42.080,0:21:45.520 what i'm going to do is i'm going to put 0:21:44.559,0:21:50.080 an annotation 0:21:45.520,0:21:53.120 here and 0:21:50.080,0:21:55.440 i'm going to put a query annotation to 0:21:53.120,0:21:57.980 tell graphic life okay 0:21:55.440,0:22:00.640 take this company's 0:21:57.980,0:22:03.600 [Music] 0:22:00.640,0:22:05.760 function and expose it in the graphql 0:22:03.600,0:22:08.720 schema 0:22:05.760,0:22:10.400 if i go in firefox here i've got a 0:22:08.720,0:22:12.960 graphical 0:22:10.400,0:22:13.679 test client setup so i'm going to 0:22:12.960,0:22:17.600 refresh 0:22:13.679,0:22:20.799 the page and oops 0:22:17.600,0:22:24.400 okay i'm getting an error let's make 0:22:20.799,0:22:28.480 a quick zoom on this error and basically 0:22:24.400,0:22:32.080 what graphicality is telling me is that 0:22:28.480,0:22:35.760 in the get companies method a type hint 0:22:32.080,0:22:39.280 is missing okay you remember 0:22:35.760,0:22:41.600 that php is optionally typed but graphql 0:22:39.280,0:22:44.240 must have types so when i'm using 0:22:41.600,0:22:47.600 graphqlite i must put type 0:22:44.240,0:22:50.960 into all my functions uh 0:22:47.600,0:22:53.679 all my queries here i did not define 0:22:50.960,0:22:54.000 any return type so i need to define one 0:22:53.679,0:22:57.520 so 0:22:54.000,0:23:00.000 i'm going to say company get companies 0:22:57.520,0:23:01.440 is returning an array of companies now i 0:23:00.000,0:23:04.320 have a problem 0:23:01.440,0:23:06.720 it's that php does not have the notion 0:23:04.320,0:23:08.400 of generics so i cannot say something 0:23:06.720,0:23:11.679 like okay it's an array of company 0:23:08.400,0:23:12.559 this is not valid php right so what i'm 0:23:11.679,0:23:16.320 gonna do 0:23:12.559,0:23:19.440 is i'm going to put an uh 0:23:16.320,0:23:22.559 a code a command in the php doc and 0:23:19.440,0:23:23.280 in the php dock i can put anything and 0:23:22.559,0:23:27.360 especially 0:23:23.280,0:23:29.360 i will give a type hint to uh 0:23:27.360,0:23:31.120 to graph the light and tell him that 0:23:29.360,0:23:35.760 this array is actually 0:23:31.120,0:23:39.520 an array of companies so let's go back 0:23:35.760,0:23:43.120 to firefox refresh the page 0:23:39.520,0:23:46.880 and oh i'm getting another error 0:23:43.120,0:23:49.360 okay let's zoom on this lever 0:23:46.880,0:23:50.480 it's error driven development i'm a big 0:23:49.360,0:23:54.960 fan of ever 0:23:50.480,0:23:58.720 driven development it works really well 0:23:54.960,0:24:01.120 no i and i actually tried to 0:23:58.720,0:24:03.200 make sure that all the error messages 0:24:01.120,0:24:06.480 are quite clear 0:24:03.200,0:24:09.760 it's really important and well 0:24:06.480,0:24:12.480 in your own code try uh to pay attention 0:24:09.760,0:24:13.760 on the other messages you are generating 0:24:12.480,0:24:17.360 you are doing 0:24:13.760,0:24:19.840 your future self favor uh yeah 0:24:17.360,0:24:21.360 so basically it's telling me that in get 0:24:19.840,0:24:24.480 companies 0:24:21.360,0:24:26.400 it cannot map the class company to a 0:24:24.480,0:24:28.320 known required type 0:24:26.400,0:24:30.559 what graduality is actually tell me 0:24:28.320,0:24:34.720 telling me is that i did not tell 0:24:30.559,0:24:38.080 him explicitly that company 0:24:34.720,0:24:40.559 is a graphical type and so to do that 0:24:38.080,0:24:42.720 i simply add an annotation which is the 0:24:40.559,0:24:46.000 type annotation 0:24:42.720,0:24:48.080 and the type annotation is 0:24:46.000,0:24:49.679 telling graphical life okay map this 0:24:48.080,0:24:52.799 class to a tie 0:24:49.679,0:24:53.679 of course a type must have some face so 0:24:52.799,0:24:58.000 i'm going to 0:24:53.679,0:25:01.279 put annotations in the in the gators 0:24:58.000,0:25:04.320 here and i'm going to say okay expose 0:25:01.279,0:25:07.520 id as a fill and name 0:25:04.320,0:25:10.320 as a field and maybe website 0:25:07.520,0:25:10.880 as a field too also notice that i'm 0:25:10.320,0:25:14.080 putting 0:25:10.880,0:25:16.480 the field annotation on getters i'm not 0:25:14.080,0:25:19.440 putting the annotation 0:25:16.480,0:25:23.520 on the properties the properties are are 0:25:19.440,0:25:23.520 private so i cannot access them directly 0:25:23.919,0:25:27.360 doctrine has annotation on properties 0:25:26.880,0:25:29.679 because 0:25:27.360,0:25:30.480 it is doing some black magic and 0:25:29.679,0:25:33.120 actually 0:25:30.480,0:25:34.960 accessing directly private properties 0:25:33.120,0:25:38.159 i'm not doing that in graphic light 0:25:34.960,0:25:39.919 okay so yes i must put the fill 0:25:38.159,0:25:43.520 annotation on the getters 0:25:39.919,0:25:46.640 so let's go back to 0:25:43.520,0:25:50.159 graphical i'm refreshing the page 0:25:46.640,0:25:53.440 i don't have any error so it looks good 0:25:50.159,0:25:56.799 and if i'm looking at writing a query 0:25:53.440,0:26:00.480 i can my company pool will just appear 0:25:56.799,0:26:02.640 and yeah i can do a search on any 0:26:00.480,0:26:05.200 companies containing the a 0:26:02.640,0:26:06.320 and i'm going to display the id and the 0:26:05.200,0:26:10.000 name 0:26:06.320,0:26:10.799 place the request and it is working and 0:26:10.000,0:26:14.960 if i'm 0:26:10.799,0:26:18.960 adding the website right 0:26:14.960,0:26:20.640 good so basically you can see that i 0:26:18.960,0:26:23.840 managed to create 0:26:20.640,0:26:24.880 a graphql api by basically adding three 0:26:23.840,0:26:28.960 annotations 0:26:24.880,0:26:32.480 query type and fill which is pretty cool 0:26:28.960,0:26:35.600 um and yeah 0:26:32.480,0:26:37.919 let's so far i only fetched 0:26:35.600,0:26:39.600 fields from companies so let's do some 0:26:37.919,0:26:43.200 binding with a product 0:26:39.600,0:26:47.600 so i'm going to go in the get products 0:26:43.200,0:26:50.640 getter and i'm gonna add a field on it 0:26:47.600,0:26:53.440 i'm gonna refresh the page 0:26:50.640,0:26:55.120 and i'm getting another evolve if i'm 0:26:53.440,0:26:57.120 zooming on this error 0:26:55.120,0:26:58.320 it is telling me that it cannot map the 0:26:57.120,0:27:01.600 product class 0:26:58.320,0:27:02.640 to a known graphical type okay we 0:27:01.600,0:27:06.000 already saw 0:27:02.640,0:27:08.159 this error two minutes ago so i'm pretty 0:27:06.000,0:27:09.919 sure you know what i should do i should 0:27:08.159,0:27:12.880 go in the product class 0:27:09.919,0:27:14.159 and instruct graphicalize that the 0:27:12.880,0:27:17.440 product 0:27:14.159,0:27:19.600 class is also a tie 0:27:17.440,0:27:22.080 and so i'm putting a type here and i'm 0:27:19.600,0:27:22.080 going to 0:27:22.399,0:27:29.520 put a field annotation 0:27:26.480,0:27:32.840 on the id on the name 0:27:29.520,0:27:34.559 on the price on the margin of the 0:27:32.840,0:27:38.559 product and 0:27:34.559,0:27:38.559 if i'm refreshing the page 0:27:38.720,0:27:43.360 yeah everything seems to be going great 0:27:40.799,0:27:46.840 and i can access the products 0:27:43.360,0:27:48.720 and access the id and the name of the 0:27:46.840,0:27:52.320 product 0:27:48.720,0:27:55.600 and it's working yeah 0:27:52.320,0:27:59.200 so that's it and basically 0:27:55.600,0:28:02.080 my job when i set up a graphql api 0:27:59.200,0:28:02.640 becomes adding a few annotations and 0:28:02.080,0:28:05.039 yeah 0:28:02.640,0:28:05.039 that's it 0:28:05.679,0:28:13.039 so yeah for the live demo 0:28:09.600,0:28:15.520 i won't be going any further i will be 0:28:13.039,0:28:16.080 presenting you very quickly a few 0:28:15.520,0:28:20.000 additional 0:28:16.080,0:28:22.240 features for instance if you want to put 0:28:20.000,0:28:23.679 to create a mutation you have a mutation 0:28:22.240,0:28:25.760 annotation 0:28:23.679,0:28:27.440 that can be used to create a mutation it 0:28:25.760,0:28:30.880 works exactly the same as 0:28:27.440,0:28:32.799 the query annotation works 0:28:30.880,0:28:35.279 there is a brilliant support for 0:28:32.799,0:28:37.360 authentication and authorization 0:28:35.279,0:28:38.480 that is plugged into your favorite 0:28:37.360,0:28:41.600 framework 0:28:38.480,0:28:43.440 laravel symphony whatever but basically 0:28:41.600,0:28:47.520 if you are using the right annotation 0:28:43.440,0:28:50.880 and passing the name of a write 0:28:47.520,0:28:54.399 well then this query will be 0:28:50.880,0:28:55.600 visible only if the user that is 0:28:54.399,0:28:57.520 currently logged 0:28:55.600,0:29:00.240 has this right you can also use the 0:28:57.520,0:29:02.480 right annotation and feels directly 0:29:00.240,0:29:05.039 you can even do fine-grained 0:29:02.480,0:29:08.080 authorization 0:29:05.039,0:29:10.000 if you want to say that some objects can 0:29:08.080,0:29:13.760 be seen but not others 0:29:10.000,0:29:17.039 in this example i've got an email field 0:29:13.760,0:29:19.919 from a user and basically i am saying 0:29:17.039,0:29:20.240 that i am looking at the component of 0:29:19.919,0:29:23.679 the 0:29:20.240,0:29:26.559 the user of the current user 0:29:23.679,0:29:27.840 and comparing it with the company of the 0:29:26.559,0:29:30.880 user that is logged 0:29:27.840,0:29:32.320 user here refers to the user that is 0:29:30.880,0:29:35.440 currently loaded 0:29:32.320,0:29:37.440 and basically this is saying i can see 0:29:35.440,0:29:39.840 the email of the people that are 0:29:37.440,0:29:41.200 in the same company as me i can see the 0:29:39.840,0:29:43.200 email of my colleagues 0:29:41.200,0:29:44.880 but i cannot see the email of someone 0:29:43.200,0:29:47.840 that is 0:29:44.880,0:29:48.480 not my colleague so with this security 0:29:47.840,0:29:51.039 annotation 0:29:48.480,0:29:53.520 we can have something that is going 0:29:51.039,0:29:56.960 quite deep 0:29:53.520,0:29:59.919 to do fine-grained authorization 0:29:56.960,0:30:01.200 another feature i like a lot is auto 0:29:59.919,0:30:05.120 wiring 0:30:01.200,0:30:08.640 uh basically here we are in a domain 0:30:05.120,0:30:12.159 object a product and uh 0:30:08.640,0:30:12.960 let's admit i want to compute the v80 of 0:30:12.159,0:30:15.039 a product 0:30:12.960,0:30:16.399 computing the v80 of a product can be 0:30:15.039,0:30:20.000 quite complicated 0:30:16.399,0:30:23.039 maybe i need to know uh the type of the 0:30:20.000,0:30:26.960 product the country the 0:30:23.039,0:30:29.840 uh the user is in so it can be difficult 0:30:26.960,0:30:31.440 and we typically won't do it in the 0:30:29.840,0:30:34.399 domain object but rather 0:30:31.440,0:30:36.000 rather we will call a service but you 0:30:34.399,0:30:39.360 when you are in a domain object 0:30:36.000,0:30:42.480 accessing services accessing services is 0:30:39.360,0:30:45.520 difficult and what we can do here is 0:30:42.480,0:30:46.960 auto wire called the auto wire ring and 0:30:45.520,0:30:47.919 basically graphic light will 0:30:46.960,0:30:50.799 automatically 0:30:47.919,0:30:52.480 inject when i'm calling the v80 field it 0:30:50.799,0:30:55.360 will automatically inject 0:30:52.480,0:30:56.080 from the dependency injection container 0:30:55.360,0:30:59.039 the service 0:30:56.080,0:31:01.200 the v80 service and i can use it 0:30:59.039,0:31:05.039 directly in the resolver here 0:31:01.200,0:31:07.360 so it enables me to access services and 0:31:05.039,0:31:08.399 from a domain object by passing those 0:31:07.360,0:31:10.960 services 0:31:08.399,0:31:11.519 in parameters of the resolver which is 0:31:10.960,0:31:15.279 kind of 0:31:11.519,0:31:17.120 kind of cool yeah there are many many 0:31:15.279,0:31:20.240 more features 0:31:17.120,0:31:21.120 available uh we have support for 0:31:20.240,0:31:23.760 validation 0:31:21.120,0:31:24.159 uh for uh indium types even if they 0:31:23.760,0:31:28.240 don't 0:31:24.159,0:31:30.399 exist in php file uploads um 0:31:28.240,0:31:31.760 what i invite you to do if you are 0:31:30.399,0:31:34.880 interested 0:31:31.760,0:31:38.080 in trying out graphqlite is 0:31:34.880,0:31:41.200 having a look at the documentation 0:31:38.080,0:31:44.559 everything is i hope clearly documented 0:31:41.200,0:31:45.120 and if you have any issue well you can 0:31:44.559,0:31:49.039 always 0:31:45.120,0:31:52.480 contact me either on 0:31:49.039,0:31:55.760 twitter directly or if you prefer 0:31:52.480,0:31:58.960 uh just open an issue 0:31:55.760,0:32:02.000 on the graphqlite repository yeah 0:31:58.960,0:32:05.120 so yeah that's repetitive let's wrap uh 0:32:02.000,0:32:08.080 this um this talk uh 0:32:05.120,0:32:09.440 basically uh doing graphql in php is 0:32:08.080,0:32:12.559 definitely possible 0:32:09.440,0:32:13.200 you have many possibilities out there uh 0:32:12.559,0:32:16.640 and this is 0:32:13.200,0:32:19.919 since graphql is pretty cool uh 0:32:16.640,0:32:20.960 well i definitely invite you to to try 0:32:19.919,0:32:24.080 it out 0:32:20.960,0:32:26.480 and uh that's it do you have any 0:32:24.080,0:32:26.480 questions 0:32:27.120,0:32:30.320 thanks so much david it was such 0:32:29.039,0:32:32.640 incredible talk 0:32:30.320,0:32:35.519 i really enjoyed it all the life current 0:32:32.640,0:32:35.519 day we were scared 0:32:35.760,0:32:39.440 yeah everything was incredible so that's 0:32:37.600,0:32:43.039 great uh so yeah 0:32:39.440,0:32:46.240 do yeah we have a question yes 0:32:43.039,0:32:49.519 uh so florian he's asking about 0:32:46.240,0:32:52.559 if graph graphic graph live 0:32:49.519,0:32:55.440 is is gonna support or is currently 0:32:52.559,0:32:57.200 supporting subscriptions 0:32:55.440,0:32:59.919 it is not currently supporting 0:32:57.200,0:33:03.440 subscriptions 0:32:59.919,0:33:06.960 i plan to add support for subscriptions 0:33:03.440,0:33:09.760 in the future maybe 0:33:06.960,0:33:10.880 not in the in the two coming months 0:33:09.760,0:33:14.480 because i want to 0:33:10.880,0:33:16.880 to release a version 4.1 of graphqlite 0:33:14.480,0:33:18.080 and i'm no subscriptions won't be part 0:33:16.880,0:33:22.559 of this release 0:33:18.080,0:33:24.799 but yes i would like to to work on that 0:33:22.559,0:33:26.159 for the end of the year definitely 0:33:24.799,0:33:28.159 definitely well that 0:33:26.159,0:33:29.360 that's that sounds super exciting i 0:33:28.159,0:33:31.679 guess and 0:33:29.360,0:33:32.720 i think i have another question because 0:33:31.679,0:33:35.360 i found 0:33:32.720,0:33:36.559 out super super interesting so i'd like 0:33:35.360,0:33:39.919 to understand like 0:33:36.559,0:33:43.600 like why do you why did you decide to 0:33:39.919,0:33:45.600 go and build this incredible technology 0:33:43.600,0:33:48.399 and what are kind of like the future 0:33:45.600,0:33:52.000 plans for for it 0:33:48.399,0:33:54.559 oh okay uh um 0:33:52.000,0:33:56.080 well when i started uh writing 0:33:54.559,0:34:00.000 graphically light it was 0:33:56.080,0:34:02.640 two years ago and basically you had only 0:34:00.000,0:34:04.559 two options at the time it was using 0:34:02.640,0:34:06.480 webonix directly 0:34:04.559,0:34:08.720 or uh using um 0:34:06.480,0:34:10.879 [Music] 0:34:08.720,0:34:12.320 using ushido which is a library that has 0:34:10.879,0:34:14.159 been abandoned 0:34:12.320,0:34:18.000 and basically they were really low level 0:34:14.159,0:34:18.000 libraries and they were hard to use 0:34:18.079,0:34:21.919 and i have this huge project for a 0:34:20.480,0:34:24.079 client of mine 0:34:21.919,0:34:27.119 uh we are just at the coding machine we 0:34:24.079,0:34:30.800 are doing mostly internet and extranet 0:34:27.119,0:34:35.200 applications and a client of mine 0:34:30.800,0:34:37.200 uh had uh this huge rest api 0:34:35.200,0:34:38.879 with a lot of end points and maybe read 0:34:37.200,0:34:41.760 on the end points 0:34:38.879,0:34:42.240 i wanted to do graphql because i knew 0:34:41.760,0:34:44.560 that 0:34:42.240,0:34:46.240 the flexibility of graph create would be 0:34:44.560,0:34:49.440 really really beneficial 0:34:46.240,0:34:50.960 for that client and uh the only option i 0:34:49.440,0:34:55.200 had was webonix which was 0:34:50.960,0:34:57.599 too hard to use uh and so i decided 0:34:55.200,0:35:00.880 i started writing a small library which 0:34:57.599,0:35:04.240 became a bit more complex 0:35:00.880,0:35:05.599 and uh i did two three versions of the 0:35:04.240,0:35:09.200 library and then i 0:35:05.599,0:35:09.440 i told myself okay uh i i must work on 0:35:09.200,0:35:12.560 it 0:35:09.440,0:35:14.640 really seriously put it on um 0:35:12.560,0:35:15.760 open source it and well that's how 0:35:14.640,0:35:19.040 graphic light 0:35:15.760,0:35:19.599 was born actually well that sounds that 0:35:19.040,0:35:22.000 sounds 0:35:19.599,0:35:22.720 so great and i think like thanks so much 0:35:22.000,0:35:24.400 for 0:35:22.720,0:35:26.400 contributing with the graphql community 0:35:24.400,0:35:27.839 in this case in the php because 0:35:26.400,0:35:30.000 yeah i think there are not so many 0:35:27.839,0:35:33.200 people that either they don't know that 0:35:30.000,0:35:34.880 they are able to do these or they 0:35:33.200,0:35:36.320 figure out they like realize that it's a 0:35:34.880,0:35:38.480 bit more difficult so it's even like a 0:35:36.320,0:35:42.160 start you know like to contribute so 0:35:38.480,0:35:44.560 i i i think like like like this is super 0:35:42.160,0:35:46.800 super super interested and i think like 0:35:44.560,0:35:48.240 a if the people they do know this 0:35:46.800,0:35:48.560 library they are going to start to use 0:35:48.240,0:35:50.000 it 0:35:48.560,0:35:52.079 they are going to like it and they are 0:35:50.000,0:35:54.320 going to like adopting their company so 0:35:52.079,0:35:55.839 um yeah thanks so much for sharing this 0:35:54.320,0:35:58.640 knowledge with us 0:35:55.839,0:35:58.640 you're welcome yeah 0:35:58.960,0:36:02.320 yeah thanks so much for like like like 0:36:00.960,0:36:04.400 like contacting us to 0:36:02.320,0:36:05.440 speak uh because it's it's been 0:36:04.400,0:36:06.880 difficult to find 0:36:05.440,0:36:08.320 kind of like people that they have 0:36:06.880,0:36:09.760 companies in hong kong although you are 0:36:08.320,0:36:11.280 not in hong kong right now but i 0:36:09.760,0:36:12.800 you're like really connected to the hong 0:36:11.280,0:36:15.760 kong community so 0:36:12.800,0:36:16.720 i am so so glad to have you here and 0:36:15.760,0:36:20.000 thanks so much and 0:36:16.720,0:36:23.440 i really really hope to see you soon 0:36:20.000,0:36:27.200 thank you very much okay david thanks 0:36:23.440,0:36:27.200 so up next so