Completed
Push — master ( 076975...fbb582 )
by Daniel
03:10 queued 58s
created

GridFactoryBuilder::addAnnotationDriver()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 4
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 4
rs 10
c 0
b 0
f 0
cc 1
eloc 2
nc 1
nop 0
1
<?php
2
3
namespace Psi\Component\Grid;
4
5
use Metadata\Driver\DriverChain;
6
use Metadata\MetadataFactory;
7
use Psi\Component\Grid\Action\DeleteAction;
8
use Psi\Component\Grid\Column\PropertyColumn;
9
use Psi\Component\Grid\Column\SelectColumn;
10
use Psi\Component\Grid\Filter\BooleanFilter;
11
use Psi\Component\Grid\Filter\NumberFilter;
12
use Psi\Component\Grid\Filter\StringFilter;
13
use Psi\Component\Grid\Form\GridExtension;
14
use Psi\Component\Grid\Metadata\Driver\AnnotationDriver;
15
use Psi\Component\Grid\Metadata\Driver\ArrayDriver;
16
use Psi\Component\ObjectAgent\AgentFinder;
17
use Symfony\Component\Form\Extension\Validator\ValidatorExtension;
18
use Symfony\Component\Form\FormFactoryBuilderInterface;
19
use Symfony\Component\Form\Forms;
20
use Symfony\Component\Validator\Validation;
21
22
final class GridFactoryBuilder
23
{
24
    private $agentFinder;
25
    private $formFactoryBuilder;
26
27
    private $actions = [];
28
    private $columns = [];
29
    private $filters = [];
30
    private $metadataDrivers = [];
31
32
    public static function create(
33
        AgentFinder $agentFinder,
34
        FormFactoryBuilderInterface $formFactoryBuilder = null
35
    ) {
36
        $instance = new self();
37
        $instance->agentFinder = $agentFinder;
38
        $instance->formFactoryBuilder = $formFactoryBuilder ?: Forms::createFormFactoryBuilder();
39
40
        return $instance;
41
    }
42
43
    public static function createWithDefaults(AgentFinder $agentFinder, FormFactoryBuilderInterface $formFactoryBuilder = null)
44
    {
45
        return self::create($agentFinder, $formFactoryBuilder)
46
            ->addAction('delete', new DeleteAction())
47
            ->addColumn('property', new PropertyColumn())
48
            ->addColumn('select', new SelectColumn($agentFinder))
49
            ->addFilter('string', new StringFilter())
50
            ->addFilter('boolean', new BooleanFilter())
51
            ->addFilter('number', new NumberFilter());
52
    }
53
54
    public function addArrayDriver(array $mapping)
55
    {
56
        $this->metadataDrivers[] = new ArrayDriver($mapping);
57
58
        return $this;
59
    }
60
61
    public function addAnnotationDriver()
62
    {
63
        $this->metadataDrivers[] = new AnnotationDriver();
64
    }
65
66
    public function addAction(string $name, ActionInterface $action): self
67
    {
68
        $this->actions[$name] = $action;
69
70
        return $this;
71
    }
72
73
    public function addFilter(string $name, FilterInterface $filter)
74
    {
75
        $this->filters[$name] = $filter;
76
77
        return $this;
78
    }
79
80
    public function addColumn(string $name, ColumnInterface $column)
81
    {
82
        $this->columns[$name] = $column;
83
84
        return $this;
85
    }
86
87
    public function createGridFactory()
88
    {
89
        if (empty($this->metadataDrivers)) {
90
            throw new \InvalidArgumentException(
91
                'You must add at least one metadata driver (e.g. ->addArrayDriver, ->addAnnotationDriver, ->addXmlDriver)'
92
            );
93
        }
94
95
        $actionRegistry = new ActionRegistry();
96
        foreach ($this->actions as $name => $action) {
97
            $actionRegistry->register($name, $action);
98
        }
99
        $columnRegistry = new ColumnRegistry();
100
        foreach ($this->columns as $name => $column) {
101
            $columnRegistry->register($name, $column);
102
        }
103
        $filterRegistry = new FilterRegistry();
104
        foreach ($this->filters as $name => $filter) {
105
            $filterRegistry->register($name, $filter);
106
        }
107
108
        $metadataDriver = new DriverChain($this->metadataDrivers);
109
        $columnFactory = new ColumnFactory($columnRegistry);
110
        $metadataFactory = new MetadataFactory($metadataDriver);
111
112
        $validator = Validation::createValidator();
113
114
        $formFactory = $this->formFactoryBuilder
115
            ->addExtension(new ValidatorExtension($validator))
116
            ->addExtension(new GridExtension(
117
                $columnRegistry,
118
                $filterRegistry
119
            ))
120
            ->getFormFactory();
121
122
        $filterFactory = new FilterBarFactory($formFactory, $filterRegistry);
123
124
        $gridViewFactory = new GridViewFactory(
125
            $columnFactory,
126
            $filterFactory
127
        );
128
129
        $actionPerformer = new ActionPerformer($actionRegistry);
130
131
        return new GridFactory(
132
            $this->agentFinder,
133
            $metadataFactory,
134
            $gridViewFactory,
135
            $actionPerformer
136
        );
137
    }
138
}
139