TransformerBuilderTrait::buildTransformer()   A
last analyzed

Complexity

Conditions 5
Paths 12

Size

Total Lines 23
Code Lines 13

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 13
CRAP Score 5

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 13
c 1
b 0
f 0
dl 0
loc 23
ccs 13
cts 13
cp 1
rs 9.5222
cc 5
nc 12
nop 0
crap 5
1
<?php
2
3
namespace Bdf\Form\Util;
4
5
use Bdf\Form\ElementBuilderInterface;
6
use Bdf\Form\Registry\RegistryInterface;
7
use Bdf\Form\Transformer\NullTransformer;
8
use Bdf\Form\Transformer\TransformerAggregate;
9
use Bdf\Form\Transformer\TransformerInterface;
10
11
/**
12
 * Trait for implements builder of transformer
13
 */
14
trait TransformerBuilderTrait
15
{
16
    /**
17
     * @var array
18
     */
19
    private $transformers = [];
20
21
    /**
22
     * @var callable[]
23
     */
24
    private $transformerProviders = [];
25
26
    /**
27
     * {@inheritdoc}
28
     *
29
     * @see ElementBuilderInterface::transformer()
30
     */
31 50
    final public function transformer($transformer, bool $append = true)
32
    {
33 50
        if ($append === true) {
34 46
            $this->transformers[] = $transformer;
35
        } else {
36 9
            array_unshift($this->transformers, $transformer);
37
        }
38
39 50
        return $this;
40
    }
41
42
    /**
43
     * Add a new transformer provider
44
     * The transformer provider permit to create a transformer during the build of the element transformer
45
     * So the transformer can be configured by the element builder
46
     *
47
     * Usage:
48
     * <code>
49
     * $this->addTransformerProvider(function (RegistryInterface $registry) {
50
     *     if ($this->enableTransformer) {
51
     *         return [new MyTransformer($this->transformerOptions)];
52
     *     }
53
     *
54
     *     return [];
55
     * });
56
     * </code>
57
     *
58
     * @param callable(RegistryInterface):TransformerInterface[] $provider
59
     */
60 157
    final protected function addTransformerProvider(callable $provider): void
61
    {
62 157
        $this->transformerProviders[] = $provider;
63 157
    }
64
65
    /**
66
     * Get the registry instance
67
     *
68
     * @return RegistryInterface
69
     */
70
    abstract protected function registry(): RegistryInterface;
71
72
    /**
73
     * Create the transformer for the element
74
     *
75
     * @return TransformerInterface
76
     */
77 380
    private function buildTransformer(): TransformerInterface
78
    {
79 380
        $providedTransformers = [];
80
81 380
        foreach ($this->transformerProviders as $provider) {
82 155
            $providedTransformers = array_merge($providedTransformers, $provider($this->registry()));
83
        }
84
85 380
        $transformers = array_map([$this->registry(), 'transformer'], $this->transformers);
86
87 380
        if (!empty($providedTransformers)) {
88 124
            $transformers = array_merge($providedTransformers, $transformers);
89
        }
90
91 380
        switch (count($transformers)) {
92 380
            case 0:
93 311
                return NullTransformer::instance();
94
95 164
            case 1:
96 148
                return $transformers[0];
97
98
            default:
99 17
                return new TransformerAggregate($transformers);
100
        }
101
    }
102
}
103