de Oliver Nybroe

GraphQL în Laravel a făcut bine: cum să configurați Lighthouse într-un blog simplu

GraphQL in Laravel a facut bine cum sa configurati Lighthouse
https://lighthouse-php.netlify.com/

Recent, un nou pachet a revoluționat crearea unui API GraphQL în Laravel. Acest pachet face atât de simplu și ușor să configurați un server GraphQL, încât vă oferă aceeași senzație pe care ați avut-o prima dată când ați lucrat cu Laravel, „Ce magie este asta!”. Acest pachet este, desigur, Far.

În acest articol, voi prezenta cum să configurați Lighthouse cu un exemplu simplu de blog. Voi presupune că sunteți deja familiarizați cu elementele de bază ale GraphQL. Exemplul vă va permite să obțineți și să creați articole prin GraphQL. Farul folosește o abordare schematică. Vă definiți API creând o schemă GraphQL, apoi folosiți directive pentru a adăuga legături cu Laravel.

Rată

Pentru început, pur și simplu adăugați pachetul prin compozitor și publicați fișierul de configurare. (Pachetul laravel-graphql-playground este un client de browser GraphQL care este opțional.)

$ composer require nuwave/lighthouse$ php artisan vendor:publish --provider="NuwaveLighthouseProvidersLighthouseServiceProvider"$ composer require mll-lab/laravel-graphql-playground$ php artisan vendor:publish --provider="MLLGraphQLPlaygroundGraphQLPlaygroundServiceProvider"

Crearea schemei

Acum, pentru partea interesantă: la configurarea acestui pachet, trebuie doar să creăm următorul fișier routes/graphql/schema.graphql. Acest fișier este cel care conține întreaga noastră schemă pentru serverul graphql.

Pentru a începe, vom adăuga un punct final simplu pentru a obține toate postările din baza noastră de date. Pentru aceasta, mai întâi trebuie să ne creăm tipul de articol în fișierul schemă.

...type Article {    id: ID!    title: String!    body: String!    author: User!}

Definirea interogării schemei

Acum avem două tipuri, unul pentru articole și unul pentru utilizatori, astfel încât să putem obține autorul postării. Cu toate acestea, încă nu avem niciun punct final pentru articole, așa că hai să adăugăm unul în fișierul schemă.

type Query {  ...  articles: [Article]! @paginate(type: "paginator" model: "Article")}

Acum se mai întâmplă ceva magie. Adăugăm o directivă personalizată numită paginate. Această directivă adaugă paginarea pentru modelul dat furnizat (în acest caz articolul). De asemenea, spunem că ar trebui să utilizeze tipul paginator ceea ce va duce la crearea unui tip compatibil cu paginarea pentru noi.

Pentru a naviga prin punctele finale, să deschidem clientul GraphQL pe care l-am instalat accesând your-url.test/graphql-playground. În schemă, putem vedea acum că se numește un nou tip ArticlePaginator e adăugat. Punctul final articles returnează o instanță a ArticlePaginator.

1611501846 586 GraphQL in Laravel a facut bine cum sa configurati Lighthouse
Captură de ecran din graphql-playground

Rularea interogării

Deci, să creăm o interogare simplă pentru a obține 10 articole cu titlul și numele autorului.

query {  articles(count: 10) {    data {      title      author {        name      }    }  }}

Când executăm această interogare, rezultă o eroare care spune că nu a putut găsi o clasă numită Article. Acest lucru are sens deoarece nu am creat încă modelul. Acest mesaj de depanare este vizibil doar pentru că nu rulăm într-un mediu de producție.

1611501846 780 GraphQL in Laravel a facut bine cum sa configurati Lighthouse
Captură de ecran din graphql-playground care arată erori de nici o clasă de articol

Crearea modelului nostru și a migrațiilor

Deci, să creăm modelele și migrațiile noastre. În mod implicit, Lighthouse caută modele în interior app/models. Pentru a face mai ușor, vom adăuga aici modelul articolului. Nu trebuie să mutăm modelul de utilizator, deoarece în fișierul schemă, spațiul de nume pentru utilizator a fost tastat direct.

$ php artisan make:model Models\Article -m

Apoi actualizați migrarea și modelele:

Interogarea articolelor

Acum că modelele și migrațiile noastre sunt configurate, haideți să migram baza de date și să verificăm dacă nu reușește.

1611501846 416 GraphQL in Laravel a facut bine cum sa configurati Lighthouse
Captură de ecran din graphql-playground care nu arată niciun rezultat

Deci, putem vedea acum că punctul final funcționează, dar nu avem date în baza de date. Vom adăuga câteva manual și apoi vom aborda cum să faceți acest lucru prin GraphQL.

1611501846 872 GraphQL in Laravel a facut bine cum sa configurati Lighthouse
Captură de ecran din graphql-playground care prezintă articole

Grozav! Acum putem prelua articole prin GraphQL. Să adăugăm, de asemenea, suport pentru obținerea articolelor de la un utilizator. Pentru a face acest lucru, trebuie să ne schimbăm GraphQL user tastați pentru a avea o relație cu articolele.

...type User {  id: ID!  name: String!  email: String!  created_at: DateTime!  updated_at: DateTime!  articles: [Article] @hasMany(relation:"articles" type:"paginator")}
1611501847 466 GraphQL in Laravel a facut bine cum sa configurati Lighthouse
Captură de ecran din graphql-playground care prezintă articole de la utilizator

Deoarece acesta este GraphQL, am putea continua să îl legăm. Deci, putem obține autorul acum din articol și apoi din articolele acelui autor și așa mai departe (chiar dacă ar fi destul de inutil).

1611501847 608 GraphQL in Laravel a facut bine cum sa configurati Lighthouse
Captură de ecran din graphql-playground care arată interogare inutilă

Crearea unui mutator

Acum să adăugăm un mutator pentru crearea unui nou articol. Acest punct final va avea nevoie și de autentificare. Desigur, trebuie să fim utilizatori în sistem înainte de a putea crea un articol nou. Pentru a face acest lucru vom folosi middleware-ul Laravel auth:api. Eliminați toate mutațiile anterioare, deoarece nu avem nevoie de ele și adăugați următoarele:

type Mutation @group(middleware: ["auth:api"]) {    createArticle(title: String!, body: String!): Article        @create(model: "Article")        @inject(context: "user.id", name: "author_id")}

Autentificarea mutatorului

Pentru a utiliza auth:api middleware, va trebui să configurăm un Guard. Pentru acest exemplu, vom folosi doar TokenGuard. Pentru utilizarea protecției token-ului, trebuie să adăugăm un câmp la utilizatorul numit api_token, iar apoi valoarea este simbolul dvs.

Schema::create('users', function (Blueprint $table) {    $table->increments('id');    $table->string('name');    $table->string('email')->unique();    $table->timestamp('email_verified_at')->nullable();    $table->string('password');    $table->string('api_token'); // The new API token field    $table->rememberToken();    $table->timestamps();});

Acum adăugăm manual simbolul în baza de date și îl setăm la secret (vă puteți crea propria interfață de utilizare pentru setarea simbolului sau pentru utilizare Pașaport Laravel). Apoi adăugăm acest simbol la solicitarea noastră, astfel încât să fim autentificați.

1611501847 58 GraphQL in Laravel a facut bine cum sa configurati Lighthouse
Captură de ecran din graphql-playground care arată anteturile

Folosind mutatorul

1611501847 870 GraphQL in Laravel a facut bine cum sa configurati Lighthouse
Captură de ecran din graphql-playground care arată mutația

Avem acum un nou articol și putem vedea că autorul care l-a creat a fost utilizatorul nostru autentificat. Deci, acum avem o API GraphQL foarte simplă funcțională, dar cu suport pentru obținerea articolelor noastre și crearea lor!

Sper că ți-a plăcut această postare și dacă vrei să afli mai multe, vizitează Documentația farului. De asemenea, puteți găsi exemplul creat mai sus pe Github.