Completed
Pull Request — master (#68)
by Daniel
02:25
created

GridFactoryBuilder::addArrayDriver()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 6
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 6
rs 9.4285
c 0
b 0
f 0
cc 1
eloc 3
nc 1
nop 1
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Psi\Component\Grid;
6
7
use Metadata\Driver\DriverChain;
8
use Metadata\MetadataFactory;
9
use Psi\Component\Grid\Action\DeleteAction;
10
use Psi\Component\Grid\Column\DateTimeColumn;
11
use Psi\Component\Grid\Column\PropertyColumn;
12
use Psi\Component\Grid\Column\SelectColumn;
13
use Psi\Component\Grid\Filter\BooleanFilter;
14
use Psi\Component\Grid\Filter\NumberFilter;
15
use Psi\Component\Grid\Filter\StringFilter;
16
use Psi\Component\Grid\Form\GridExtension;
17
use Psi\Component\Grid\Metadata\Driver\AnnotationDriver;
18
use Psi\Component\Grid\Metadata\Driver\ArrayDriver;
19
use Psi\Component\ObjectAgent\AgentFinder;
20
use Symfony\Component\Form\Extension\Validator\ValidatorExtension;
21
use Symfony\Component\Form\FormFactoryBuilderInterface;
22
use Symfony\Component\Form\Forms;
23
use Symfony\Component\Validator\Validation;
24
use Psi\Component\Grid\Column\MoneyColumn;
25
26
final class GridFactoryBuilder
27
{
28
    private $agentFinder;
29
    private $formFactoryBuilder;
30
31
    private $actions = [];
32
    private $columns = [];
33
    private $filters = [];
34
    private $metadataDrivers = [];
35
36
    public static function create(
37
        AgentFinder $agentFinder,
38
        FormFactoryBuilderInterface $formFactoryBuilder = null
39
    ) {
40
        $instance = new self();
41
        $instance->agentFinder = $agentFinder;
42
        $instance->formFactoryBuilder = $formFactoryBuilder ?: Forms::createFormFactoryBuilder();
43
44
        return $instance;
45
    }
46
47
    public static function createWithDefaults(AgentFinder $agentFinder, FormFactoryBuilderInterface $formFactoryBuilder = null)
48
    {
49
        return self::create($agentFinder, $formFactoryBuilder)
50
            ->addAction(new DeleteAction(), 'delete')
51
            ->addColumn(new PropertyColumn(), 'property')
52
            ->addColumn(new SelectColumn($agentFinder), 'select')
53
            ->addColumn(new MoneyColumn(), 'select')
54
            ->addColumn(new DateTimeColumn(), 'datetime')
55
            ->addFilter(new StringFilter(), 'string')
56
            ->addFilter(new BooleanFilter(), 'boolean')
57
            ->addFilter(new NumberFilter(), 'number')
58
    }
0 ignored issues
show
Bug introduced by
This code did not parse for me. Apparently, there is an error somewhere around this line:

Syntax error, unexpected '}', expecting ';'
Loading history...
59
60
    public function addArrayDriver(array $mapping)
61
    {
62
        $this->metadataDrivers[] = new ArrayDriver($mapping);
63
64
        return $this;
65
    }
66
67
    public function addAnnotationDriver()
68
    {
69
        $this->metadataDrivers[] = new AnnotationDriver();
70
71
        return $this;
72
    }
73
74
    public function addAction(ActionInterface $action, $alias = null): self
75
    {
76
        $this->actions[$alias] = $action;
77
78
        return $this;
79
    }
80
81
    public function addFilter(FilterInterface $filter, $alias = null)
82
    {
83
        $this->filters[$alias] = $filter;
84
85
        return $this;
86
    }
87
88
    public function addColumn(ColumnInterface $column, $alias = null)
89
    {
90
        $this->columns[$alias] = $column;
91
92
        return $this;
93
    }
94
95
    public function createGridFactory()
96
    {
97
        if (empty($this->metadataDrivers)) {
98
            throw new \InvalidArgumentException(
99
                'You must add at least one metadata driver (e.g. ->addArrayDriver, ->addAnnotationDriver, ->addXmlDriver)'
100
            );
101
        }
102
103
        $actionRegistry = new ActionRegistry();
104
        foreach ($this->actions as $alias => $action) {
105
            $actionRegistry->register($action, $alias);
106
        }
107
        $columnRegistry = new ColumnRegistry();
108
        foreach ($this->columns as $alias => $column) {
109
            $columnRegistry->register($column, $alias);
110
        }
111
        $filterRegistry = new FilterRegistry();
112
        foreach ($this->filters as $alias => $filter) {
113
            $filterRegistry->register($filter, $alias);
114
        }
115
116
        $metadataDriver = new DriverChain($this->metadataDrivers);
117
        $columnFactory = new ColumnFactory($columnRegistry);
118
        $metadataFactory = new MetadataFactory($metadataDriver);
119
120
        $validator = Validation::createValidator();
121
122
        $formFactory = $this->formFactoryBuilder
123
            ->addExtension(new ValidatorExtension($validator))
124
            ->addExtension(new GridExtension(
125
                $columnRegistry,
126
                $filterRegistry
127
            ))
128
            ->getFormFactory();
129
130
        $filterFactory = new FilterBarFactory($formFactory, $filterRegistry);
131
        $queryFactory = new QueryFactory($metadataFactory);
132
133
        $gridViewFactory = new GridViewFactory(
134
            $columnFactory,
135
            $filterFactory,
136
            $queryFactory
137
        );
138
139
        $actionPerformer = new ActionPerformer($actionRegistry);
140
141
        return new GridFactory(
142
            $this->agentFinder,
143
            $metadataFactory,
144
            $gridViewFactory,
145
            $actionPerformer
146
        );
147
    }
148
}
149