petecoop / laravel-actions-lighthouse
Requires
- illuminate/contracts: ^8.15|^9.0|^10.0
- lorisleiva/laravel-actions: ^2.0
- nuwave/lighthouse: ^5.7
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'], ]; } }