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