1blankz7/php-object-query

Quering object graphs in PHP

dev-master 2022-12-08 13:10 UTC

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]]