FilterFactory   A
last analyzed

Complexity

Total Complexity 13

Size/Duplication

Total Lines 70
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 1

Test Coverage

Coverage 100%

Importance

Changes 0
Metric Value
wmc 13
lcom 1
cbo 1
dl 0
loc 70
ccs 23
cts 23
cp 1
rs 10
c 0
b 0
f 0

2 Methods

Rating   Name   Duplication   Size   Complexity  
A registerFilter() 0 7 4
B createFilter() 0 34 9
1
<?php
2
declare(strict_types=1);
3
4
namespace Sirius\Filtration;
5
6
use Sirius\Filtration\Filter\AbstractFilter;
7
use Sirius\Filtration\Filter\Callback;
8
9
class FilterFactory
10
{
11
    protected $filtersMap = [
12
        'callback' => '\Sirius\Filtration\Filter\Callback',
13
        'censor' => '\Sirius\Filtration\Filter\Censor',
14
        'cleanarray' => '\Sirius\Filtration\Filter\CleanArray',
15
        'double' => '\Sirius\Filtration\Filter\Double',
16
        'integer' => '\Sirius\Filtration\Filter\Integer',
17
        'normalizedate' => '\Sirius\Filtration\Filter\NormalizeDate',
18
        'normalizenumber' => '\Sirius\Filtration\Filter\NormalizeNumber',
19
        'nullify' => '\Sirius\Filtration\Filter\Nullify',
20
        'obfuscate' => '\Sirius\Filtration\Filter\Obfuscate',
21
        'stringtrim' => '\Sirius\Filtration\Filter\StringTrim',
22
        'trim' => '\Sirius\Filtration\Filter\StringTrim',
23
        'truncate' => '\Sirius\Filtration\Filter\Truncate'
24
    ];
25
26 1
    public function registerFilter($name, $class)
27
    {
28 1
        if ($class && class_exists($class) && is_subclass_of($class, '\Sirius\Filtration\Filter\AbstractFilter')) {
0 ignored issues
show
Bug introduced by
Due to PHP Bug #53727, is_subclass_of returns inconsistent results on some PHP versions for interfaces; you could instead use ReflectionClass::implementsInterface.
Loading history...
29 1
            $this->filtersMap[$name] = $class;
30
        }
31 1
        return $this;
32
    }
33
34
35
    /**
36
     * Factory method to create a filter from various options
37
     *
38
     * @param callable|string $callbackOrFilterName
39
     * @param string|array $options
40
     * @param bool $resursive
41
     * @throws \InvalidArgumentException
42
     * @return AbstractFilter
43
     */
44 19
    public function createFilter($callbackOrFilterName, $options = null, $resursive = false): AbstractFilter
45
    {
46 19
        if (is_callable($callbackOrFilterName)) {
47 3
            return new Callback([
48 3
                'callback' => $callbackOrFilterName,
49 3
                'arguments' => $options
50 3
            ], $resursive);
51
        }
52
53 17
        if (is_string($callbackOrFilterName)) {
54 14
            if (class_exists('\Sirius\Filtration\Filter\\' . $callbackOrFilterName)) {
55 11
                $callbackOrFilterName = '\Sirius\Filtration\Filter\\' . $callbackOrFilterName;
56
            }
57
            // use the validator map
58 14
            if (isset($this->filtersMap[strtolower($callbackOrFilterName)])) {
59 1
                $callbackOrFilterName = $this->filtersMap[strtolower($callbackOrFilterName)];
60
            }
61
62 14
            if (class_exists($callbackOrFilterName) && is_subclass_of($callbackOrFilterName, AbstractFilter::class)) {
0 ignored issues
show
Bug introduced by
Due to PHP Bug #53727, is_subclass_of might return inconsistent results on some PHP versions if \Sirius\Filtration\Filter\AbstractFilter::class can be an interface. If so, you could instead use ReflectionClass::implementsInterface.
Loading history...
63 13
                return new $callbackOrFilterName($options, $resursive);
64
            } else {
65 1
                throw new \InvalidArgumentException(sprintf(
66 1
                    'Impossible to determine the filter based on the name %s',
67 1
                    (string) $callbackOrFilterName
68
                ));
69
            }
70
        }
71
72 3
        if (is_object($callbackOrFilterName) && $callbackOrFilterName instanceof AbstractFilter) {
73 2
            return $callbackOrFilterName;
74
        }
75
76 1
        throw new \InvalidArgumentException('Invalid value for the $callbackorFilterName parameter');
77
    }
78
}
79