Completed
Push — master ( 2ea3ba...7ce705 )
by Bukashk0zzz
08:21 queued 04:22
created

Filter::getLaminasInstance()   A

Complexity

Conditions 5
Paths 5

Size

Total Lines 21

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 21
rs 9.2728
c 0
b 0
f 0
cc 5
nc 5
nop 2
1
<?php declare(strict_types = 1);
2
3
namespace Bukashk0zzz\FilterBundle\Service;
4
5
use Bukashk0zzz\FilterBundle\Annotation\FilterAnnotation;
6
use Doctrine\Common\Annotations\CachedReader;
7
use Doctrine\Common\Util\ClassUtils;
8
use Laminas\Filter\AbstractFilter;
9
use Laminas\Filter\FilterInterface;
10
11
/**
12
 * Class Filter
13
 */
14
class Filter
15
{
16
    /**
17
     * @var CachedReader Cached annotation reader
18
     */
19
    protected $annotationReader;
20
21
    /**
22
     * Filter constructor.
23
     *
24
     * @param CachedReader $annotationReader
25
     */
26
    public function __construct(CachedReader $annotationReader)
27
    {
28
        $this->annotationReader = $annotationReader;
29
    }
30
31
    /**
32
     * @param mixed $object
33
     */
34
    public function filterEntity($object): void
35
    {
36
        if ($object === null) {
37
            return;
38
        }
39
40
        $reflectionClass = ClassUtils::newReflectionClass(\get_class($object));
41
42
        foreach ($reflectionClass->getProperties() as $property) {
43
            foreach ($this->annotationReader->getPropertyAnnotations($property) as $annotation) {
44
                if (!($annotation instanceof FilterAnnotation)) {
45
                    continue;
46
                }
47
48
                $property->setAccessible(true);
49
                $value = $property->getValue($object);
50
51
                if (!$value) {
52
                    continue;
53
                }
54
55
                $filter = $annotation->getFilter();
56
                $options = $annotation->getOptions();
57
                $property->setValue($object, $this->getLaminasInstance($filter, $options)->filter($value));
58
            }
59
        }
60
    }
61
62
    /**
63
     * @param string            $class
64
     * @param array<mixed>|null $options
65
     *
66
     * @return \Laminas\Filter\FilterInterface
67
     */
68
    protected function getLaminasInstance(string $class, ?array $options): FilterInterface
69
    {
70
        /** @var AbstractFilter $filter */
71
        $filter = new $class();
72
73
        $abstractFilterClass = AbstractFilter::class;
74
75
        if (!$filter instanceof $abstractFilterClass) {
76
            throw new \InvalidArgumentException("Filter class must extend $abstractFilterClass: $class");
77
        }
78
79
        try {
80
            if ($options !== null && \count($options) !== 0) {
81
                $filter->setOptions($options);
82
            }
83
84
            return $filter;
85
        } catch (\Throwable $e) {
86
            return new $class($options);
87
        }
88
    }
89
}
90