1blankz7 / php-object-query
Quering object graphs in PHP
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: 2024-10-08 17:16:44 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]]