dev-master
9999999-devQuering object graphs in PHP
MIT
The Requires
The Development Requires
Quering object graphs in PHP
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., (*1)
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., (*2)
<?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., (*3)
There are three main definitions in the system you can use. Path
, Value
and Composition
., (*4)
The Value
definition is a plain container which will return the given value., (*5)
<?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]
The Composition
definition is a more flexible alternative to Value
. It gives access to the current source., (*6)
<?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
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., (*7)
<?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]]
Quering object graphs in PHP
MIT