/
Resolver.php
79 lines (69 loc) · 2.39 KB
/
Resolver.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
<?php
namespace SilverStripe\GraphQL\Schema\DataObject;
use GraphQL\Type\Definition\ResolveInfo;
use SilverStripe\GraphQL\QueryHandler\SchemaConfigProvider;
use SilverStripe\GraphQL\Schema\Exception\SchemaBuilderException;
use SilverStripe\GraphQL\Schema\SchemaConfig;
use SilverStripe\ORM\DataList;
use SilverStripe\ORM\DataObject;
use SilverStripe\ORM\FieldType\DBField;
use SilverStripe\ORM\SS_List;
/**
* Generic resolver for DataObjects
*/
class Resolver
{
/**
* @param DataObject $obj
* @param array $args
* @param array $context
* @param ResolveInfo|null $info
* @return array|bool|int|mixed|DataList|DataObject|DBField|SS_List|string|null
* @throws SchemaBuilderException
*/
public static function resolve($obj, $args = [], $context = [], ?ResolveInfo $info = null)
{
$fieldName = $info->fieldName;
$config = SchemaConfigProvider::get($context);
return static::getResolvedField($obj, $fieldName, $config);
}
/**
* Just the basic ViewableData field accessor bit, without all the property mapping
* overhead. Useful for custom dataobject types that circumvent the model layer.
*
* @param DataObject $obj
* @param array $args
* @param array $context
* @param ResolveInfo|null $info
* @return array|bool|int|mixed|DataList|DataObject|DBField|SS_List|string|null
*/
public static function baseResolve($obj, $args = [], $context = [], ?ResolveInfo $info = null)
{
$fieldName = $info->fieldName;
$result = FieldAccessor::singleton()->accessField($obj, $fieldName);
if ($result instanceof DBField) {
return $result->getValue();
}
return $result;
}
/**
* @param $obj
* @param string $fieldName
* @param SchemaConfig $config
* @return mixed|null
* @throws SchemaBuilderException
*/
public static function getResolvedField($obj, string $fieldName, SchemaConfig $config)
{
$class = get_class($obj);
$resolvedField = null;
while (!$resolvedField && $class && $class !== DataObject::class) {
$resolvedField = $config->mapFieldByClassName($class, $fieldName);
$class = get_parent_class($class ?? '');
}
if (!$resolvedField) {
return null;
}
return FieldAccessor::singleton()->accessField($obj, $resolvedField[1]);
}
}