GraphQL with Laravel 12: A Complete Beginner-to-Advanced Guide

Author

Kritim Yantra

Apr 11, 2025

GraphQL with Laravel 12: A Complete Beginner-to-Advanced Guide

Harnessing the Power of Laravel 12 and GraphQL: A Modern API Development Guide

In the ever-evolving landscape of web development, combining robust frameworks with efficient query languages can unlock unparalleled productivity and performance. Laravel, a beloved PHP framework, continues to dominate backend development with its elegant syntax and powerful features. With the release of Laravel 12, developers gain access to cutting-edge tools that streamline API creation. Pair this with GraphQL, a flexible query language for APIs, and you have a dynamic duo for building scalable, efficient, and maintainable applications.

In this blog, we’ll explore how to integrate GraphQL into a Laravel 12 project, dive into practical examples, and discuss best practices for leveraging this powerful combination.


Why Laravel 12 and GraphQL?

Laravel 12: What’s New?

Laravel 12 builds on its predecessors with enhancements like:

  • Simpler Artisan Commands: Reduced boilerplate for model factories and migrations.
  • Improved Routing Caching: Faster API response times.
  • Enhanced Security: Stricter default middleware settings.
  • Better Testing Utilities: Streamlined PHPUnit integrations.

These updates make Laravel 12 an ideal backend framework for modern applications.

GraphQL: A Game-Changer for APIs

Unlike REST, GraphQL allows clients to request exactly the data they need, eliminating over-fetching or under-fetching. Key benefits include:

  • Single Endpoint: Replace multiple REST endpoints with one flexible GraphQL endpoint.
  • Strong Typing: Define clear data structures with schemas.
  • Real-Time Data: Support subscriptions for live updates.
  • Self-Documenting: Introspection enables automatic API documentation.

Together, Laravel 12 and GraphQL empower developers to build efficient, future-proof APIs.


Setting Up GraphQL in Laravel 12

Step 1: Install Laravel and Dependencies

Create a new Laravel 12 project:

composer create-project laravel/laravel laravel-graphql
cd laravel-graphql

Install the Lighthouse package, a popular GraphQL server for Laravel:

composer require nuwave/lighthouse

Step 2: Configure GraphQL Schema

Define your schema in graphql/schema.graphql:

type Query {
    users: [User!]! @all
    user(id: ID! @eq): User @find
}

type Mutation {
    createUser(name: String!, email: String! @rules(apply: ["email"])): User @create
}

type User {
    id: ID!
    name: String!
    email: String!
    created_at: String!
    updated_at: String!
}

Here, we define queries to fetch users and a mutation to create a user, leveraging Lighthouse’s directives like @all, @find, and @create.

Step 3: Generate and Migrate Database

Create a User model and migration:

php artisan make:model User -m

Update the migration file and run:

php artisan migrate

Step 4: Test Your GraphQL API

Use tools like Postman or GraphQL Playground to send requests:

# Fetch all users
query {
    users {
        id
        name
    }
}

# Create a user
mutation {
    createUser(name: "John Doe", email: "john@example.com") {
        id
        name
    }
}

Advanced Features

1. Authentication & Authorization

Secure your API using Laravel’s built-in middleware. Add the @guard directive to resolvers:

type Mutation {
    createPost(title: String!, content: String!): Post
        @guard
        @can(ability: "create", model: "App\\Models\\Post")
}

Configure policies in app/Policies/PostPolicy.php.

2. Real-Time Subscriptions

Enable real-time updates with Lighthouse subscriptions. First, install the Lighthouse subscription package:

composer require nuwave/lighthouse-subscriptions

Define a subscription in your schema:

type Subscription {
    postCreated: Post!
}

Broadcast events using Laravel Echo and WebSockets (e.g., Pusher or Laravel Websockets).

3. Optimizing Performance with DataLoader

Avoid the N+1 query problem using DataLoader to batch and cache database requests:

use GraphQL\Type\Definition\ResolveInfo;
use Nuwave\Lighthouse\Support\Contracts\GraphQLContext;

class UserResolver
{
    public function posts(User $user, args, GraphQLContext $context, ResolveInfo $info)
    {
        return GraphQL::batchLoad(Post::class, 'user_id', $user->id);
    }
}

Best Practices

  1. Validate Inputs: Use Laravel’s validation rules within GraphQL mutations:
    type Mutation {
        createUser(
            email: String! @rules(apply: ["email", "unique:users"])
        ): User @create
    }
    
  2. Paginate Results: Improve performance with pagination directives:
    type Query {
        posts: [Post!]! @paginate(type: "paginator" model: "App\\Post")
    }
    
  3. Cache Frequently Used Queries: Leverage Laravel’s caching mechanisms for heavy queries.

Error Handling

GraphQL provides detailed error messages. Customize error responses in app/Exceptions/Handler.php:

public function render($request, Throwable $e)
{
    if ($e instanceof ValidationError) {
        return response()->json([
            'errors' => $e->getMessages(),
        ], 422);
    }
    return parent::render($request, $e);
}

Conclusion

Laravel 12 and GraphQL form a potent combination for building modern, scalable APIs. By leveraging Laravel’s elegance and GraphQL’s flexibility, developers can create efficient backends that adapt to client needs. Whether you’re building a mobile app, a SaaS platform, or a real-time dashboard, this stack ensures maintainability and performance.

Start experimenting with the examples above, and explore advanced features like custom directives, federation, and performance monitoring to take your API to the next level. Happy coding! 🚀

Tags

Laravel Php

Comments

No comments yet. Be the first to comment!

Please log in to post a comment:

Continue with Google

Related Posts