Completed
Push — middleware-wip ( ab6ae7...17e892 )
by Romain
02:53
created

MiddlewareState   A

Complexity

Total Complexity 19

Size/Duplication

Total Lines 189
Duplicated Lines 0 %

Coupling/Cohesion

Components 2
Dependencies 7

Importance

Changes 0
Metric Value
wmc 19
lcom 2
cbo 7
dl 0
loc 189
rs 10
c 0
b 0
f 0

10 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 14 2
A run() 0 10 1
A getMiddlewaresBoundToSignal() 0 8 2
B getSignalSortedMiddlewares() 0 23 5
A sortMiddlewaresListByPriority() 0 17 3
A getFormObject() 0 4 1
A getResult() 0 8 2
A getRequest() 0 4 1
A getArguments() 0 4 1
A getSettings() 0 4 1
1
<?php
2
/*
3
 * 2017 Romain CANON <[email protected]>
4
 *
5
 * This file is part of the TYPO3 FormZ project.
6
 * It is free software; you can redistribute it and/or modify it
7
 * under the terms of the GNU General Public License, either
8
 * version 3 of the License, or any later version.
9
 *
10
 * For the full copyright and license information, see:
11
 * http://www.gnu.org/licenses/gpl-3.0.html
12
 */
13
14
namespace Romm\Formz\Middleware\State;
15
16
use Romm\Formz\Controller\ControllerState;
17
use Romm\Formz\Error\FormResult;
18
use Romm\Formz\Form\FormObject;
19
use Romm\Formz\Middleware\Items\Begin\BeginMiddleware;
20
use Romm\Formz\Middleware\Items\End\EndMiddleware;
21
use Romm\Formz\Middleware\MiddlewareInterface;
22
use TYPO3\CMS\Extbase\Mvc\Controller\Arguments;
23
use TYPO3\CMS\Extbase\Mvc\Web\Request;
24
25
/**
26
 * @todo: loop on middlewares and detect which ones are using signals that wont
27
 * be processed. This should probably be a validator put on:
28
 *      \Romm\Formz\Configuration\Form\Form::$middlewares
29
 */
30
class MiddlewareState
31
{
32
    /**
33
     * @var MiddlewareInterface[]
34
     */
35
    protected $list = [];
36
37
    /**
38
     * @var FormObject
39
     */
40
    protected $formObject;
41
42
    /**
43
     * @var FormResult
44
     */
45
    protected $result;
46
47
    /**
48
     * @var Request
49
     */
50
    protected $request;
51
52
    /**
53
     * @var Arguments
54
     */
55
    protected $arguments;
56
57
    /**
58
     * @var array
59
     */
60
    protected $settings;
61
62
    /**
63
     * @see getSignalSortedMiddlewares()
64
     *
65
     * @var array
66
     */
67
    protected $signalSortedMiddlewares = [];
68
69
    /**
70
     * @param FormObject      $formObject
71
     * @param ControllerState $controllerState
72
     */
73
    public function __construct(FormObject $formObject, ControllerState $controllerState)
74
    {
75
        $this->formObject = $formObject;
76
        $this->request = $controllerState->getRequest();
77
        $this->arguments = $controllerState->getArguments();
78
        $this->settings = $controllerState->getSettings();
79
80
        foreach ($this->formObject->getConfiguration()->getMiddlewares() as $middleware) {
81
            $this->list[] = $middleware;
82
83
            $middleware->bindMiddlewareState($this);
84
            $middleware->initialize();
85
        }
86
    }
87
88
    /**
89
     * Will run and process trough every middleware registered for the current
90
     * form object.
91
     */
92
    public function run()
93
    {
94
        $beginMiddleware = new BeginMiddleware;
95
        $beginMiddleware->bindMiddlewareState($this);
96
        $beginMiddleware->execute();
97
98
        $endMiddleware = new EndMiddleware;
99
        $endMiddleware->bindMiddlewareState($this);
100
        $endMiddleware->execute();
101
    }
102
103
    /**
104
     * Returns the sorted list of middlewares bound to the given signal name.
105
     *
106
     * @param string $signalName
107
     * @return array
108
     */
109
    public function getMiddlewaresBoundToSignal($signalName)
110
    {
111
        $signalSortedMiddlewares = $this->getSignalSortedMiddlewares();
112
113
        return (isset($signalSortedMiddlewares[$signalName]))
114
            ? $signalSortedMiddlewares[$signalName]
115
            : [];
116
    }
117
118
    /**
119
     * Returns a sorted list of the registered middlewares: the first level is
120
     * the signal used by the group, and the second level is the group of
121
     * middlewares, sorted by descendant priority of each middleware.
122
     *
123
     * @return array
124
     */
125
    protected function getSignalSortedMiddlewares()
126
    {
127
        if (empty($this->signalSortedMiddlewares)) {
128
            $this->signalSortedMiddlewares = [];
129
            $middlewareList = [];
130
131
            foreach ($this->list as $middleware) {
132
                $signal = $middleware->getBoundSignalName();
133
134
                if (false === isset($middlewareList[$signal])) {
135
                    $middlewareList[$signal] = [];
136
                }
137
138
                $middlewareList[$signal][] = $middleware;
139
            }
140
141
            foreach ($middlewareList as $key => $list) {
142
                $this->signalSortedMiddlewares[$key] = $this->sortMiddlewaresListByPriority($list);
143
            }
144
        }
145
146
        return $this->signalSortedMiddlewares;
147
    }
148
149
    /**
150
     * Will sort and return a middlewares list based on the priority of each
151
     * middleware. The middlewares with the highest priority will be placed at
152
     * the top of the list.
153
     *
154
     * @param array $list
155
     * @return array
156
     */
157
    private function sortMiddlewaresListByPriority(array $list)
158
    {
159
        usort($list, function (MiddlewareInterface $a, MiddlewareInterface $b) {
160
            $priorityA = (int)$a->getPriority();
161
            $priorityB = (int)$b->getPriority();
162
163
            if ($priorityA === $priorityB) {
164
                return 0;
165
            }
166
167
            return $priorityA < $priorityB
168
                ? 1
169
                : -1;
170
        });
171
172
        return $list;
173
    }
174
175
    /**
176
     * @return FormObject
177
     */
178
    public function getFormObject()
179
    {
180
        return $this->formObject;
181
    }
182
183
    /**
184
     * @return FormResult
185
     */
186
    public function getResult()
187
    {
188
        if (null === $this->result) {
189
            $this->result = new FormResult;
190
        }
191
192
        return $this->result;
193
    }
194
195
    /**
196
     * @return Request
197
     */
198
    public function getRequest()
199
    {
200
        return $this->request;
201
    }
202
203
    /**
204
     * @return Arguments
205
     */
206
    public function getArguments()
207
    {
208
        return $this->arguments;
209
    }
210
211
    /**
212
     * @return array
213
     */
214
    public function getSettings()
215
    {
216
        return $this->settings;
217
    }
218
}
219