ListManager::__construct()   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 20
Code Lines 9

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 10
CRAP Score 1

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 9
c 1
b 0
f 0
dl 0
loc 20
ccs 10
cts 10
cp 1
rs 9.9666
cc 1
nc 1
nop 9
crap 1

How to fix   Many Parameters   

Many Parameters

Methods with many parameters are not only hard to understand, but their parameters also often become inconsistent when you need more, or different data.

There are several approaches to avoid long parameter lists:

1
<?php
2
3
namespace Povs\ListerBundle\Service;
4
5
use Povs\ListerBundle\Declaration\ListInterface;
6
use Povs\ListerBundle\DependencyInjection\Locator\ListLocator;
7
use Povs\ListerBundle\Exception\ListException;
8
use Povs\ListerBundle\Factory\MapperFactory;
9
use Povs\ListerBundle\Factory\ListValueFactory;
10
use Povs\ListerBundle\Factory\ViewFactory;
11
use Povs\ListerBundle\View\ListView;
12
use Symfony\Component\HttpFoundation\Response;
13
14
/**
15
 * @author Povilas Margaiatis <[email protected]>
16
 */
17
class ListManager
18
{
19
    /**
20
     * @var ListTypeResolver
21
     */
22
    private $typeResolver;
23
24
    /**
25
     * @var ConfigurationResolver
26
     */
27
    private $configurationResolver;
28
29
    /**
30
     * @var RequestHandler
31
     */
32
    private $requestHandler;
33
34
    /**
35
     * @var FilterBuilder
36
     */
37
    private $filterBuilder;
38
39
    /**
40
     * @var ListQueryBuilder
41
     */
42
    private $queryBuilder;
43
44
    /**
45
     * @var ViewFactory
46
     */
47
    private $viewFactory;
48
49
    /**
50
     * @var MapperFactory
51
     */
52
    private $mapperFactory;
53
54
    /**
55
     * @var ListValueFactory
56
     */
57
    private $valueFactory;
58
59
    /**
60
     * @var ListLocator
61
     */
62
    private $listLocator;
63
64
    /**
65
     * Is set when called buildList method
66
     *
67
     * @var ListView|null
68
     */
69
    private $listView;
70
71
    /**
72
     * ListManager constructor.
73
     *
74
     * @param ListTypeResolver      $typeResolver
75
     * @param ConfigurationResolver $configurationResolver
76
     * @param RequestHandler        $requestHandler
77
     * @param FilterBuilder         $filterBuilder
78
     * @param ListQueryBuilder      $queryBuilder
79
     * @param ViewFactory           $viewFactory
80
     * @param MapperFactory         $mapperFactory
81
     * @param ListValueFactory      $valueFactory
82
     * @param ListLocator           $listLocator
83
     */
84 4
    public function __construct(
85
        ListTypeResolver $typeResolver,
86
        ConfigurationResolver $configurationResolver,
87
        RequestHandler $requestHandler,
88
        FilterBuilder $filterBuilder,
89
        ListQueryBuilder $queryBuilder,
90
        ViewFactory $viewFactory,
91
        MapperFactory $mapperFactory,
92
        ListValueFactory $valueFactory,
93
        ListLocator $listLocator
94
    ) {
95 4
        $this->typeResolver = $typeResolver;
96 4
        $this->configurationResolver = $configurationResolver;
97 4
        $this->requestHandler = $requestHandler;
98 4
        $this->filterBuilder = $filterBuilder;
99 4
        $this->queryBuilder = $queryBuilder;
100 4
        $this->viewFactory = $viewFactory;
101 4
        $this->mapperFactory = $mapperFactory;
102 4
        $this->valueFactory = $valueFactory;
103 4
        $this->listLocator = $listLocator;
104
    }
105
106
    /**
107
     * @param string $list
108
     * @param string $type
109
     * @param array  $parameters
110
     */
111 2
    public function buildList(string $list, string $type, array $parameters = []): void
112
    {
113 2
        $list = $this->generateList($list, $parameters);
114 2
        $this->typeResolver->resolveType($type);
115 2
        $listMapper = $this->mapperFactory->createListMapper($list, $this->typeResolver->getTypeName());
116 2
        $filterMapper = $this->mapperFactory->createFilterMapper($list);
117 2
        $filterForm = $this->filterBuilder->buildFilterForm($filterMapper);
118 2
        $this->requestHandler->handleRequest($listMapper, $filterMapper, $filterForm);
119 2
        $listValue = $this->valueFactory->createListValue($listMapper, $filterMapper);
120 2
        $joinMapper = $this->mapperFactory->createJoinMapper($list, $listMapper, $filterMapper, $listValue);
121 2
        $queryBuilder = $this->queryBuilder->buildQuery($list, $joinMapper, $listMapper, $filterMapper, $listValue);
122 2
        $lazyQueryBuilder = $this->queryBuilder->buildLazyQuery($list, $joinMapper, $listMapper);
123 2
        $this->listView = $this->viewFactory->createView(
124 2
            $listMapper,
125 2
            $filterForm,
126 2
            $queryBuilder,
127 2
            $lazyQueryBuilder,
128 2
            $this->typeResolver->getPerPage(),
129 2
            $this->typeResolver->getCurrentPage()
130 2
        );
131
    }
132
133
    /**
134
     * @param array $options
135
     *
136
     * @return Response
137
     */
138 2
    public function getResponse(array $options = []): Response
139
    {
140 2
        if (!$this->listView) {
141 1
            throw ListException::listNotBuilt();
142
        }
143
144 1
        return $this->typeResolver->getResponse($this->listView, $options);
145
    }
146
147
    /**
148
     * @param array $options
149
     *
150
     * @return mixed
151
     */
152 2
    public function getData(array $options = [])
153
    {
154 2
        if (!$this->listView) {
155 1
            throw ListException::listNotBuilt();
156
        }
157
158 1
        return $this->typeResolver->getData($this->listView, $options);
159
    }
160
161
    /**
162
     * @param string $list
163
     * @param array  $parameters
164
     *
165
     * @return ListInterface
166
     */
167 2
    private function generateList(string $list, array $parameters = []): ListInterface
168
    {
169 2
        $list = $this->listLocator->get($list);
170 2
        $list->setParameters($parameters);
171 2
        $this->configurationResolver->resolve($list);
172
173 2
        return $list;
174
    }
175
}
176