Completed
Push — middleware-wip ( a42479 )
by Romain
02:55
created

MiddlewareState   A

Complexity

Total Complexity 14

Size/Duplication

Total Lines 113
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 6

Importance

Changes 0
Metric Value
wmc 14
lcom 1
cbo 6
dl 0
loc 113
rs 10
c 0
b 0
f 0

6 Methods

Rating   Name   Duplication   Size   Complexity  
A run() 0 18 2
A sendBeforeSignal() 0 11 2
A sendAfterSignal() 0 11 2
B sendSignal() 0 30 6
A getFormObject() 0 4 1
A getRequest() 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\Form\FormObject;
17
use Romm\Formz\Middleware\Items\Begin\BeginMiddleware;
18
use Romm\Formz\Middleware\Items\End\EndMiddleware;
19
use Romm\Formz\Middleware\MiddlewareInterface;
20
use Romm\Formz\Middleware\Signal\After;
21
use Romm\Formz\Middleware\Signal\Before;
22
use Romm\Formz\Middleware\Signal\SendsMiddlewareSignal;
23
use TYPO3\CMS\Core\SingletonInterface;
24
use TYPO3\CMS\Extbase\Mvc\Web\Request;
25
26
/**
27
 * @todo: loop on middlewares and detect which ones are using signals that wont
28
 * be processed. This should probably be a validator put on:
29
 *      \Romm\Formz\Configuration\Form\Form::$middlewares
30
 */
31
class MiddlewareState implements SingletonInterface
32
{
33
    /**
34
     * @var MiddlewareInterface
35
     */
36
    protected $list = [];
37
38
    /**
39
     * @var FormObject
40
     */
41
    protected $formObject;
42
43
    /**
44
     * @var Request
45
     */
46
    protected $request;
47
48
    /**
49
     * @todo
50
     *
51
     * @param FormObject $formObject
52
     * @param Request    $request
53
     */
54
    public function run(FormObject $formObject, Request $request)
55
    {
56
        $this->formObject = $formObject;
57
        $this->request = $request;
58
59
        foreach ($formObject->getConfiguration()->getMiddlewares() as $middleware) {
60
            $this->list[] = $middleware;
61
            $middleware->attachMiddlewareState($this);
62
        }
63
64
        $beginMiddleware = new BeginMiddleware;
65
        $beginMiddleware->attachMiddlewareState($this);
66
        $beginMiddleware->execute();
67
68
        $endMiddleware = new EndMiddleware;
69
        $endMiddleware->attachMiddlewareState($this);
70
        $endMiddleware->execute();
71
    }
72
73
    public function sendBeforeSignal(SendsMiddlewareSignal $from)
74
    {
75
        $this->sendSignal(
76
            $from,
77
            function (MiddlewareInterface $middleware) {
78
                if ($middleware instanceof Before) {
79
                    $middleware->before();
80
                }
81
            }
82
        );
83
    }
84
85
    public function sendAfterSignal(SendsMiddlewareSignal $from)
86
    {
87
        $this->sendSignal(
88
            $from,
89
            function (MiddlewareInterface $middleware) {
90
                if ($middleware instanceof After) {
91
                    $middleware->after();
92
                }
93
            }
94
        );
95
    }
96
97
    protected function sendSignal(SendsMiddlewareSignal $from, callable $callback)
98
    {
99
        $signal = $from::getSignal();
100
        /** @var MiddlewareInterface[] $middlewareList */
101
        $middlewareList = [];
102
103
        foreach ($this->list as $middleware) {
0 ignored issues
show
Bug introduced by
The expression $this->list of type object<Romm\Formz\Middleware\MiddlewareInterface> is not traversable.
Loading history...
104
            if ($middleware instanceof $signal) {
105
                $middlewareList[] = $middleware;
106
            }
107
        }
108
109
        usort($middlewareList, function(MiddlewareInterface $a, MiddlewareInterface $b) {
110
            $priorityA = $a->getPriority();
111
            $priorityB = $b->getPriority();
112
113
            if ($priorityA === $priorityB) {
114
                return 0;
115
            }
116
117
            return $priorityA < $priorityB
118
                ? 1
119
                : -1;
120
        });
121
        \TYPO3\CMS\Extbase\Utility\DebuggerUtility::var_dump($middlewareList, '$middlewareList');
122
123
        foreach ($middlewareList as $middleware) {
124
            call_user_func($callback, $middleware);
125
        }
126
    }
127
128
    /**
129
     * @return FormObject
130
     */
131
    public function getFormObject()
132
    {
133
        return $this->formObject;
134
    }
135
136
    /**
137
     * @return mixed
138
     */
139
    public function getRequest()
140
    {
141
        return $this->request;
142
    }
143
}
144
145