Passed
Pull Request — master (#249)
by Dmitriy
02:46
created

Embedded::__construct()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 8
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 2

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 1
c 1
b 0
f 0
dl 0
loc 8
ccs 0
cts 2
cp 0
rs 10
cc 1
nc 1
nop 5
crap 2
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Yiisoft\Validator\Attribute;
6
7
use Attribute;
8
use Closure;
9
use ReflectionAttribute;
10
use ReflectionClass;
11
use Yiisoft\Validator\Rule\GroupRule;
12
use Yiisoft\Validator\RuleInterface;
13
use Yiisoft\Validator\ValidationContext;
14
15
/**
16
 * Collects all attributes from the reference and represents it as its own.
17
 */
18
#[Attribute(Attribute::TARGET_PROPERTY | Attribute::IS_REPEATABLE)]
19
final class Embedded extends GroupRule
20
{
21
    /**
22
     * @psalm-param Closure(mixed, ValidationContext):bool|null $when
23
     */
24
    public function __construct(
25
        private string $referenceClassName,
26
        string $message = 'This value is not a valid.',
27
        bool $skipOnEmpty = false,
28
        bool $skipOnError = false,
29
        ?Closure $when = null,
30
    ) {
31
        parent::__construct($message, $skipOnEmpty, $skipOnError, $when);
32
    }
33
34
    public function getRuleSet(): array
35
    {
36
        $classMeta = new ReflectionClass($this->referenceClassName);
37
38
        return $this->collectAttributes($classMeta);
39
    }
40
41
    // TODO: use Generator to collect attributes
42
    private function collectAttributes(ReflectionClass $classMeta): array
43
    {
44
        $rules = [];
45
        foreach ($classMeta->getProperties() as $property) {
46
            $attributes = $property->getAttributes(RuleInterface::class, ReflectionAttribute::IS_INSTANCEOF);
47
            foreach ($attributes as $attribute) {
48
                $rules[$property->getName()][] = $attribute->newInstance();
49
            }
50
        }
51
52
        return $rules;
53
    }
54
}
55