1blankz7 / php-object-query
Quering object graphs in PHP
Installs: 2
Dependents: 0
Suggesters: 0
Security: 0
Stars: 0
Watchers: 2
Forks: 0
pkg:composer/1blankz7/php-object-query
Requires
- symfony/property-access: ^v6.2
Requires (Dev)
- phpstan/phpstan: ^1.9
- phpunit/phpunit: ^9.5
- squizlabs/php_codesniffer: ^3.7
This package is auto-updated.
Last update: 2025-10-08 19:32:09 UTC
README
This library allows you to query your object graph in a consistent way. You can use it to support object mapping and to generate data representation based on the requirements of external systems.
Usage
Query and the QueryResolver are the two key components of the system. A resolver needs one or more queries and
resolves these queries by processing them on a given object graph.
<?php use Lemonade\ObjectQuery\Query\Query; use Lemonade\ObjectQuery\QueryResolver; use Lemonade\ObjectQuery\Definition\Path; $resolver = new QueryResolver( new Query('shipName', (new Path())->get('name')) ); $resolver->resolve($someShip); // ['shipName' => 'Millenium Falcon']
A query consists of a name which ends up being the key in the result and a definition.
There are three main definitions in the system you can use. Path, Value and Composition.
Value
The Value definition is a plain container which will return the given value.
<?php use Lemonade\ObjectQuery\Query\Query; use Lemonade\ObjectQuery\QueryResolver; use Lemonade\ObjectQuery\Definition\Value; $resolver = new QueryResolver( new Query('two', new Value(2)) ); $resolver->resolve($someObject); // ['two' => 2]
Composition
The Composition definition is a more flexible alternative to Value. It gives access to the current source.
<?php use Lemonade\ObjectQuery\Query\Query; use Lemonade\ObjectQuery\QueryResolver; use Lemonade\ObjectQuery\Definition\Composition; use Lemonade\ObjectQuery\Source\ObjectSource; $composition = new Composition(function(ObjectSource $source) { return $source->get('id'); }); $resolver = new QueryResolver( new Query('someKey', $composition) ); $resolver->resolve($someObject); // ['someKey' => 3000]
Path
Path is the most complex definition. You can deep walk into the graph, filter collections and transform leaves. Have a
look into the tests to get an impression of the possibilities.
<?php use ObjectQuery\Query\Query; use ObjectQuery\QueryResolver; use ObjectQuery\Definition\Path; $path = (new Path())->get('appearsIn') ->filter(new EpisodeFilter(Episode::EMPIRE)) ->get('episode'); $resolver = new QueryResolver(new Query('episodes', $path)); $resolver->resolveArray($someObject); // ['episode' => [1, 2]]