petecoop/laravel-actions-lighthouse

v2.0.0 2023-02-22 10:50 UTC

This package is auto-updated.

Last update: 2024-03-30 00:21:48 UTC


README

Create Actions with Laravel Actions that are resolved by Lighthouse allowing a GraphQL query/mutation to hit an action directly.

Install

composer require petecoop/laravel-actions-lighthouse

GraphQL Actions

Add the AsGraphQL trait to your action:

use Petecoop\LaravelActionsLighthouse\AsGraphQL;

class SomeAction
{
    use AsAction, AsGraphQL;
}

This is resolved based on name of the query in your schema.graphql:

type Query {
    someAction: SomeResult
}

Ensure you register the path to the handler in config/lighthouse.php this may need to be published first: php artisan vendor:publish --tag=lighthouse-config

If adding a mutation then add to mutations - this needs to be done for each folder of actions

[
    'namespaces' => [
        'queries' => [
            'App\\GraphQL\\Queries',
            'App\\Actions',
            'App\\Actions\\User',
        ],
    ]
]

You can then use the args from GraphQL directly in your handler:

type Mutation {
    updateUserName(id: ID!, name: String!): User!
}

The arguments are passed in as named arguments to the handle method:

class UpdateUserName
{
    use AsAction, AsGraphQL;

    public function handle(string $id, string $name)
    {
        //...
    }
}

Or use asGraphQL to pull out args from the graphql query, useful if you want to have more control over the args:

class SomeAction
{
    use AsAction, AsGraphQL;

    public function handle(int $userId, string $name)
    {
        //...
    }

    public function asGraphQL($_, $args)
    {
        return $this->handle($args['id'], $args['name']);
    }
}

Validation

You can use Laravel Action Validation Rules by using the @actionValidator directive.

Add "Petecoop\\LaravelActionsLighthouse" to your config/lighthouse.php:

"directives" => ["App\\GraphQL\\Directives", "Petecoop\\LaravelActionsLighthouse"],

for example:

type Mutation {
    updateUserName(id: ID!, name: String!): User! @actionValidator
}

rules(), getValidationMessages() and getValidationAttributes() currently work.

class UpdateUserName
{
    use AsAction, AsGraphQL;

    public function handle(string $id, string $name)
    {
        //...
    }

    public function rules(): array
    {
        return [
            'name' => ['required', 'min:3'],
        ];
    }
}