Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add @bind directive as a GraphQL analogue for Laravel's Route Model Binding #2645

Merged
merged 34 commits into from
Jan 9, 2025

Conversation

remipelhate
Copy link
Contributor

@remipelhate remipelhate commented Dec 27, 2024

  • Added or updated tests
  • Documented user facing changes
  • Updated CHANGELOG.md

Changes

This PR aims to bring (in my opinion) one of Laravel's most convenient features to Lighthouse's resolver system: Route Model Binding.

The code is based on an implementation I did a couple of months ago for a different project and as it has been really useful, I thought it maybe could be useful for others as well.

The general idea is to allow developers to define bindings for resolver arguments through the schema using a new @bind directive, which resolves a scalar identifier to an (Eloquent) model instance:

type Mutation {
    addUserToCompany(
        user: ID! @bind(class: "App\\Models\\User")
        company: ID! @bind(class: "App\\Models\\Company")
    ): Boolean!
}

These bindings are resolved before the query or mutation resolver is invoked, meaning that we have the instances available in the resolver without having to query for it in the resolver itself:

<?php

namespace App\Http\GraphQL\Mutations;

class AddUserToCompany
{
    /**
     * @param array{user: \App\Models\User, company: \App\Models\Company} $args
     */
    public function __invoke(mixed $root, array $args): bool
    {
        return $args['user']->associate($args['company'])->save();
    }
}

I added more examples and usages to the docs. Let me know if you think this would be a good addition to Lighthouse ;)

Breaking changes

This PR does not introduce any breaking changes.

@remipelhate
Copy link
Contributor Author

Sorry for the many added lines, but at least most of them are coming from test cases.

@remipelhate remipelhate force-pushed the feature/bind-directive branch 2 times, most recently from c05a733 to 2cf8ced Compare December 27, 2024 20:35
@remipelhate remipelhate force-pushed the feature/bind-directive branch from 2cf8ced to 23dd711 Compare December 27, 2024 20:44
@spawnia spawnia added the enhancement A feature or improvement label Jan 2, 2025
Copy link
Collaborator

@spawnia spawnia left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I like the concept!

docs/master/api-reference/directives.md Outdated Show resolved Hide resolved
docs/master/api-reference/directives.md Outdated Show resolved Hide resolved
docs/master/api-reference/directives.md Outdated Show resolved Hide resolved
docs/master/api-reference/directives.md Outdated Show resolved Hide resolved
docs/master/api-reference/directives.md Outdated Show resolved Hide resolved
src/Bind/Validation/BindingExists.php Outdated Show resolved Hide resolved
tests/Utils/Bind/SpyCallableClassBinding.php Outdated Show resolved Hide resolved
tests/Integration/Bind/BindDirectiveTest.php Outdated Show resolved Hide resolved
tests/Integration/Bind/BindDirectiveTest.php Outdated Show resolved Hide resolved
tests/Integration/Bind/BindDirectiveTest.php Outdated Show resolved Hide resolved
docs/master/api-reference/directives.md Outdated Show resolved Hide resolved
docs/master/api-reference/directives.md Outdated Show resolved Hide resolved
src/Bind/BindDefinition.php Outdated Show resolved Hide resolved
src/Bind/BindDirective.php Outdated Show resolved Hide resolved
src/Bind/BindDirective.php Outdated Show resolved Hide resolved
src/Bind/BindDirective.php Outdated Show resolved Hide resolved
src/Bind/ModelBinding.php Outdated Show resolved Hide resolved
tests/Utils/Bind/SpyCallableClassBinding.php Outdated Show resolved Hide resolved
tests/Utils/Bind/SpyCallableClassBinding.php Outdated Show resolved Hide resolved
tests/Utils/Bind/SpyCallableClassBinding.php Outdated Show resolved Hide resolved
@remipelhate remipelhate requested a review from spawnia January 3, 2025 14:31
@spawnia spawnia merged commit fe23e87 into nuwave:master Jan 9, 2025
@spawnia
Copy link
Collaborator

spawnia commented Jan 9, 2025

Released with https://github.com/nuwave/lighthouse/releases/tag/v6.48.0.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
enhancement A feature or improvement
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants