Milind Daraniya

Introduction to GraphQL in Laravel: Building APIs

Published February 19th, 2023 21 min read

GraphQL is a powerful query language for APIs that enables clients to request exactly the data they need and nothing more. It provides a more efficient and flexible way to interact with APIs compared to traditional RESTful approaches. In this tutorial, we'll explore how to implement GraphQL in a Laravel application to build efficient and customizable APIs.

Before we begin, make sure you have the following installed:

  1. PHP and Laravel (latest version)
  2. Composer

Set Up Laravel Project

Create a new Laravel project using the Laravel installer:

composer create-project --prefer-dist laravel/laravel graphql-api
cd graphql-api

Install and Configure GraphQL Package

To add GraphQL functionality to your Laravel application, we'll use the lighthouse-php/lighthouse package. Install it via Composer:

composer require nuwave/lighthouse

After installation, publish the configuration file:

php artisan vendor:publish --provider="Nuwave\Lighthouse\LighthouseServiceProvider"

Create GraphQL Schema

Define your GraphQL schema in the graphql/schema.graphql file. This schema will specify the types and queries available in your API. Here's a basic example:

type Query {
    hello: String!
}

Create Resolver

Next, create a resolver for the hello query to handle the data retrieval logic. Resolvers are responsible for fetching the data for a particular query or mutation:

php artisan make:resolver HelloResolver

In the generated HelloResolver class, define the resolver logic:

namespace App\GraphQL\Resolvers;

use Nuwave\Lighthouse\Support\Contracts\GraphQLContext;

class HelloResolver
{
    public function resolve($rootValue, array $args, GraphQLContext $context)
    {
        return 'Hello, GraphQL!';
    }
}

Register Resolver

Register the HelloResolver in the config/lighthouse.php configuration file. Add the following entry to the resolvers array:

'resolvers' => [
    'Query' => [
        'hello' => 'App\\GraphQL\\Resolvers\\HelloResolver',
    ],
],

Set Up Routes

In the routes/graphql.php file, define the GraphQL route:

Route::post('/graphql', function (\Illuminate\Http\Request $request) {
    return \Nuwave\Lighthouse\Support\Http\GraphQLRequest::createFromRequest($request)->execute();
});

Test GraphQL Query

Start your Laravel development server:

php artisan serve

Now, you can send a GraphQL query to the /graphql endpoint. Using a tool like Insomnia or Postman, make a POST request to http://localhost:8000/graphql with the following JSON payload:

{
    "query": "query { hello }"
}

You should receive the following response:

{
    "data": {
        "hello": "Hello, GraphQL!"
    }
}

Congratulations! You have successfully implemented GraphQL in your Laravel application. GraphQL provides a more efficient and flexible way to build APIs, allowing clients to request only the data they need. By defining your GraphQL schema and resolvers, you can easily customize your API responses and handle complex data queries.

GraphQL's ability to handle multiple queries in a single request, introspect schemas, and avoid over-fetching or under-fetching of data makes it an excellent choice for building modern and scalable APIs with Laravel.