Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
100.00% covered (success)
100.00%
17 / 17
100.00% covered (success)
100.00%
3 / 3
CRAP
100.00% covered (success)
100.00%
1 / 1
SchemaFieldLoader
100.00% covered (success)
100.00%
17 / 17
100.00% covered (success)
100.00%
3 / 3
4
100.00% covered (success)
100.00%
1 / 1
 __construct
100.00% covered (success)
100.00%
8 / 8
100.00% covered (success)
100.00%
1 / 1
2
 fetchAttribute
100.00% covered (success)
100.00%
5 / 5
100.00% covered (success)
100.00%
1 / 1
1
 fetchAttributes
100.00% covered (success)
100.00%
4 / 4
100.00% covered (success)
100.00%
1 / 1
1
1<?php
2
3/**
4 * @license MIT
5 * @author hazuki3417<hazuki3417@gmail.com>
6 * @copyright 2022 hazuki3417 all rights reserved.
7 */
8
9namespace Selen\MongoDB\Attribute;
10
11use LogicException;
12use ReflectionAttribute;
13use ReflectionProperty;
14use Selen\MongoDB\Attributes\Nest;
15use Selen\MongoDB\Attributes\SchemaField;
16
17/**
18 * MongoDB SchemaのFieldに設定されたAttributeを読み込むクラス
19 */
20class SchemaFieldLoader
21{
22    /** @var ReflectionProperty */
23    public $reflectionProperty;
24
25    /** @var \ReflectionAttribute<SchemaFieldMarkerInterface>|null */
26    public $attributeFieldSchema;
27
28    /** @var \ReflectionAttribute<Nest>|null */
29    public $attributeNest;
30
31    public function __construct(ReflectionProperty $reflectionProperty)
32    {
33        $this->reflectionProperty = $reflectionProperty;
34
35        $attributes = $this->fetchAttributes(SchemaFieldMarkerInterface::class);
36
37        if (1 < count($attributes)) {
38            $format = 'Invalid attribute specification. Only one "%s" can be specified.';
39            $mes    = \sprintf($format, SchemaField::class);
40            throw new LogicException($mes);
41        }
42
43        $this->attributeFieldSchema = \array_shift($attributes);
44        $this->attributeNest        = $this->fetchAttribute(Nest::class);
45    }
46
47    /**
48     * 属性を取得します(1件)
49     *
50     * @param string $attributeName 取得する属性名を渡します
51     *
52     * @return \ReflectionAttribute<object>|null 存在する場合は属性を、存在しない場合はnullを返します
53     */
54    public function fetchAttribute(string $attributeName)
55    {
56        $attributes = $this->reflectionProperty->getAttributes(
57            $attributeName,
58            ReflectionAttribute::IS_INSTANCEOF
59        );
60        return \array_shift($attributes);
61    }
62
63    /**
64     * 属性を取得します(n件)
65     *
66     * @param string $attributeName 取得する属性名を渡します
67     *
68     * @return \ReflectionAttribute<object>[] 存在する場合は属性を保持した配列を、存在しない場合は空配列を返します
69     */
70    public function fetchAttributes(string $attributeName)
71    {
72        return $this->reflectionProperty->getAttributes(
73            $attributeName,
74            ReflectionAttribute::IS_INSTANCEOF
75        );
76    }
77}