How to implement GraphQL in Laravel

Updated: January 17, 2024 By: Guest Contributor Post a comment

Overview

Integrating GraphQL into your Laravel project can be a game-changer for your web application. GraphQL provides a more efficient and powerful alternative to the traditional REST API. It allows clients to query for exactly the data they need and nothing more. In this guide, we will walk you through the process of adding GraphQL to a Laravel project.

Introduction to GraphQL

GraphQL is an open-source data query and manipulation language for APIs, and a runtime for executing queries. It provides a more descriptive and performant way to interact with your data.

Before we begin, make sure you have Laravel installed on your system. If not, you can follow one of the following tutorials:

Step-by-Step Instructions

Step 1: Install GraphQL Laravel Package

composer require rebing/graphql-laravel

This command will install the GraphQL Laravel package by Rebing, which provides a lot of functionality out of the box, including support for file uploads, error handling, and batched queries, among other features.

Step 2: Publish the configuration file

php artisan vendor:publish --provider="Rebing\GraphQL\GraphQLServiceProvider"

This command will publish the GraphQL configuration file in the config/graphql.php directory. You can adjust settings like schema declaration, security, etc., in this configuration file.

Step 3: Define your Types

In GraphQL, types are crucial as they define the shape of data that you can query. Let’s define a simple type for our GraphQL setup.

php artisan make:graphql:type UserType

Once created, edit the generated type located at app/GraphQL/Types/UserType.php:

<?php

namespace App\GraphQL\Types;

use GraphQL\TypeDefs\GraphQLType;
use GraphQL\Type\Definition\Type;
use App\Models\User;

class UserType extends GraphQLType {
  protected $attributes = [
    'name' => 'User',
    'description' => 'A user',
    'model' => User::class,
  ];

  public function fields(): array {
    return [
      'id' => [
        'type' => Type::nonNull(Type::int()),
        'description' => 'The id of the user',
      ],
      // Other fields like 'name', 'email', etc.
    ];
  }
}

Step 4: Define your Queries

Queries allow you to retrieve data in GraphQL. Let’s create a query to fetch users.

php artisan make:graphql:query UsersQuery

Wе will need to populate our app/GraphQL/Queries/UsersQuery.php:

<?php

namespace App\GraphQL\Queries;

use GraphQL\TypeDefs\GraphQLType;
use GraphQL\Type\Definition\Type;
use Rebing\GraphQL\Support\Query;

use App\Models\User;

...

Step 5: Setting up the GraphQL Schema

Now you need to set up a schema that will define your queries, mutations, and types.

Edit config/graphql.php and define a new schema:

'schemas' => [
  'default' => [
    'query' => [
      'users' => App\GraphQL\Queries\UsersQuery::class,
    ],
    // 'mutation' => [
    // ],
    // 'middleware' => [],
    // 'method' => ['get', 'post'],
  ],
],

Step 6: Create the GraphQL endpoint

Edit the routes/web.php file to add the route to the GraphQL endpoint.

Route::post('/graphql', 'GraphQLController@query');

GraphQLController will serve as the entry point for all your GraphQL queries.

Step 7: Testing your GraphQL setup

You can now test your GraphQL API. You may use tools like GraphiQL or Postman to make queries against your endpoint. Here is an example query:

{
  users {
    id
    name
  }
}

This query will return all users along with their IDs and names.

Conclusion

In this tutorial, we’ve covered the basic steps of integrating GraphQL into a Laravel project. GraphQL can provide your applications with an efficient, powerful interface for querying and manipulating data. While we touched on the high-level steps, remember that GraphQL offers much more, including mutations (for data manipulation), real-time updates with subscriptions, and advanced querying features.

By following this guide, you now have a solid foundation to build upon and explore the rich features GraphQL has to offer. As always, remember to check the official documentation of GraphQL and the Laravel package you’re using for more detailed information.