netmex / lumina
LuminaBundle: A Symfony bundle providing Lighthouse-inspired GraphQL support with automatic Doctrine integration, custom resolvers, scalars, directives, queries, and mutations.
Installs: 0
Dependents: 0
Suggesters: 0
Security: 0
Stars: 0
Watchers: 0
Forks: 0
Open Issues: 0
Type:symfony-bundle
pkg:composer/netmex/lumina
Requires
- doctrine/orm: ^3.5
- symfony/config: ^7.3
- symfony/dependency-injection: ^7.3
- symfony/event-dispatcher: ^7.3
- symfony/framework-bundle: ^7.3
- symfony/http-kernel: ^7.3
- symfony/property-access: ^7.4
- symfony/security-core: ^7.4
- symfony/serializer-pack: ^1.3
- webonyx/graphql-php: ^15.29
Requires (Dev)
- phpunit/phpunit: ^12.5
This package is not auto-updated.
Last update: 2026-01-26 20:33:02 UTC
README
LuminaBundle — A Symfony bundle providing Lighthouse-inspired GraphQL support with automatic Doctrine integration, custom resolvers, scalars, directives, queries, and mutations.
About
Netmex Lumina is a directive-driven GraphQL framework for Symfony.
Instead of writing resolvers, repositories, or query builders by hand, Lumina lets you describe behavior directly in your GraphQL schema using custom directives. Those directives are compiled once into Intents, which are then executed efficiently at runtime.
Lumina focuses on:
- Clean architecture
- Zero boilerplate resolvers
- Strong separation between schema, intent, and execution
- First-class Symfony & Doctrine integration
Core Concepts
1. Schema-Driven Behavior
Your GraphQL schema is the source of truth.
type Query { users(name: String @where): [User] @all }
No resolver classes.
No wiring.
The schema defines everything.
2. Directives = Behavior
Each directive represents a unit of intent.
Examples:
@all- Fetch all records.@where- Filter records by field.@orderBy- Sort records.
Directives are:
- Reusable
- Composable
- Framework-agnostic at the schema level
3. Intent Compilation
At schema compile time:
- The GraphQL AST is traversed once
- Directives are instantiated
- Intents are built per Type.Field
These intents are stored in an IntentRegistry and reused during execution.
- No runtime AST traversal
- No resolver discovery
- No reflection hacks
4. Execution via Doctrine
At runtime:
- Lumina resolves a field
- Looks up its compiled intent
- Builds a Doctrine
QueryBuilder - Applies argument directives
- Executes the resolver directive
Installation
composer require netmex/lumina
Using Directives
Lumina comes with many built-in directives, including:
- Query directives:
@all,@find,@where,@orderBy,@limit,@offset,@paginate - Relation directives:
@hasMany,@belongsTo,@join - Mutation directives:
@create,@update,@delete,@validate - Aggregation directives:
@count,@sum,@avg - Access control directives:
@can,@role,@owner - Utilities:
@deprecated
For detailed usage and examples, see the Directive Documentation.
Extending Lumina
Creating a Directive
Lumina allows you to create custom directives that can:
- Modify query execution
- Create input types
- Attach arguments to fields
- Modify the field’s output type
- Transform runtime output data
See the Creating a Directive Guide for a full example.
Why Lumina?
- No resolvers
- No controller logic
- No duplicated query code
- One AST pass
- Explicit intent
- Symfony & Doctrine native
Lumina is ideal if you want:
- Schema-first GraphQL
- Strong consistency
- Minimal boilerplate
- High performance
Project Status
Actively developed
The core architecture is stable and functional. More directives and documentation are planned.
License
MIT License