petecoop / laravel-actions-lighthouse
Use Laravel Actions as Lighthouse GraphQL resolvers.
Package info
github.com/petecoop/laravel-actions-lighthouse
pkg:composer/petecoop/laravel-actions-lighthouse
Requires
- php: ^8.2
- illuminate/contracts: ^11.0|^12.0|^13.0
- lorisleiva/laravel-actions: ^2.10
- nuwave/lighthouse: ^6.0
Requires (Dev)
- orchestra/testbench: ^11.0
- phpunit/phpunit: ^12.5
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.
The package registers its directive namespace automatically. If you disable package discovery,
register Petecoop\\LaravelActionsLighthouse\\ActionServiceProvider manually.
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'], ]; } }