Create Actions with Laravel Actions that are resolved by Lighthouse allowing a GraphQL query/mutation to hit an action directly.
composer require petecoop/laravel-actions-lighthouse
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']);
}
}
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'],
];
}
}