1
|
|
|
<?php |
2
|
|
|
/** |
3
|
|
|
* @link https://github.com/old-town/workflow-zf2-dispatch |
4
|
|
|
* @author Malofeykin Andrey <[email protected]> |
5
|
|
|
*/ |
6
|
|
|
namespace OldTown\Workflow\ZF2\Dispatch\Metadata\Target\Dispatch; |
7
|
|
|
|
8
|
|
|
use SplObjectStorage; |
9
|
|
|
|
10
|
|
|
|
11
|
|
|
/** |
12
|
|
|
* Class Metadata |
13
|
|
|
* |
14
|
|
|
* @package OldTown\Workflow\ZF2\Dispatch\Metadata\Target\Dispatch |
15
|
|
|
*/ |
16
|
|
|
class Metadata implements MetadataInterface |
17
|
|
|
{ |
18
|
|
|
/** |
19
|
|
|
* @var string |
20
|
|
|
*/ |
21
|
|
|
const PREPARE_DATA_RUN_TYPE_METHOD = 'method'; |
22
|
|
|
|
23
|
|
|
/** |
24
|
|
|
* Флаг определят нужно ли запускать workflow |
25
|
|
|
* |
26
|
|
|
* @var boolean |
27
|
|
|
*/ |
28
|
|
|
protected $workflowDispatch = false; |
29
|
|
|
|
30
|
|
|
/** |
31
|
|
|
* Определяет что мы хотим сделать с workflow. Запустить новый процесс (initialize), или инициировать переход в уже |
32
|
|
|
* запущенном процессе (doAction) |
33
|
|
|
* |
34
|
|
|
* @var string |
35
|
|
|
*/ |
36
|
|
|
protected $workflowRunType; |
37
|
|
|
|
38
|
|
|
/** |
39
|
|
|
* Флаг определят нужно вызвать метод или сервис, с целью подготовки данных, которые в дальнейшем передаются в workflow |
40
|
|
|
* |
41
|
|
|
* @var bool |
42
|
|
|
*/ |
43
|
|
|
protected $flagRunPrepareData = false; |
44
|
|
|
|
45
|
|
|
/** |
46
|
|
|
* Значение определяет что является обработчиком подготавливающим данные (метод контроллера, сервис и т.д.) |
47
|
|
|
* |
48
|
|
|
* @var string |
49
|
|
|
*/ |
50
|
|
|
protected $prepareDataMethod; |
51
|
|
|
|
52
|
|
|
/** |
53
|
|
|
* Строка содержащая имя обработчика (имя метода контроллера или имя сервиса) в котором происходит подготовка данных |
54
|
|
|
* |
55
|
|
|
* @var string |
56
|
|
|
*/ |
57
|
|
|
protected $prepareDataHandler; |
58
|
|
|
|
59
|
|
|
/** |
60
|
|
|
* Флаг указывает на то что есть условия для запуска workflow |
61
|
|
|
* |
62
|
|
|
* @var bool |
63
|
|
|
*/ |
64
|
|
|
protected $flagHasConditions = false; |
65
|
|
|
|
66
|
|
|
/** |
67
|
|
|
* Метаданные, содержащии информацию о том как вызвать условия, для проверка нужно ли запускать workflow |
68
|
|
|
* |
69
|
|
|
* @var DispatchConditionMetadata[]|SplObjectStorage |
70
|
|
|
*/ |
71
|
|
|
protected $conditions; |
72
|
|
|
|
73
|
|
|
/** |
74
|
|
|
* Разрешенные способы запука обработчика отвечающего за подготовку данных для wf |
75
|
|
|
* |
76
|
|
|
* @var array |
77
|
|
|
*/ |
78
|
|
|
protected $allowPrepareDataMethod = [ |
79
|
|
|
self::PREPARE_DATA_RUN_TYPE_METHOD => self::PREPARE_DATA_RUN_TYPE_METHOD |
80
|
|
|
]; |
81
|
|
|
|
82
|
|
|
/** |
83
|
|
|
* |
84
|
|
|
*/ |
85
|
|
|
public function __construct() |
86
|
|
|
{ |
87
|
|
|
$this->conditions = new SplObjectStorage(); |
88
|
|
|
} |
89
|
|
|
|
90
|
|
|
/** |
91
|
|
|
* Флаг определят нужно ли запускать workflow |
92
|
|
|
* |
93
|
|
|
* @return boolean |
94
|
|
|
*/ |
95
|
|
|
public function isWorkflowDispatch() |
96
|
|
|
{ |
97
|
|
|
return $this->workflowDispatch; |
98
|
|
|
} |
99
|
|
|
|
100
|
|
|
/** |
101
|
|
|
* Устанавливает флаг определяющий нужно ли запускать workflow |
102
|
|
|
* |
103
|
|
|
* @param boolean $workflowDispatch |
104
|
|
|
* |
105
|
|
|
* @return $this |
106
|
|
|
*/ |
107
|
|
|
public function setWorkflowDispatch($workflowDispatch) |
108
|
|
|
{ |
109
|
|
|
$this->workflowDispatch = (boolean)$workflowDispatch; |
110
|
|
|
|
111
|
|
|
return $this; |
112
|
|
|
} |
113
|
|
|
|
114
|
|
|
/** |
115
|
|
|
* Определяет что мы хотим сделать с workflow. Запустить новый процесс (initialize), или инициировать переход в уже |
116
|
|
|
* запущенном процессе (doAction) |
117
|
|
|
* |
118
|
|
|
* @return string |
119
|
|
|
*/ |
120
|
|
|
public function getWorkflowRunType() |
121
|
|
|
{ |
122
|
|
|
return $this->workflowRunType; |
123
|
|
|
} |
124
|
|
|
|
125
|
|
|
/** |
126
|
|
|
* |
127
|
|
|
* Определяет что мы хотим сделать с workflow. Запустить новый процесс (initialize), или инициировать переход в уже |
128
|
|
|
* запущенном процессе (doAction) |
129
|
|
|
* |
130
|
|
|
* @param string $workflowRunType |
131
|
|
|
* |
132
|
|
|
* @return $this |
133
|
|
|
* |
134
|
|
|
*/ |
135
|
|
|
public function setWorkflowRunType($workflowRunType) |
136
|
|
|
{ |
137
|
|
|
$this->workflowRunType = (string)$workflowRunType; |
138
|
|
|
|
139
|
|
|
return $this; |
140
|
|
|
} |
141
|
|
|
|
142
|
|
|
/** |
143
|
|
|
* Флаг определят нужно вызвать метод или сервис, с целью подготовки данных, которые в дальнейшем передаются в workflow |
144
|
|
|
* |
145
|
|
|
* @return boolean |
146
|
|
|
*/ |
147
|
|
|
public function isFlagRunPrepareData() |
148
|
|
|
{ |
149
|
|
|
return $this->flagRunPrepareData; |
150
|
|
|
} |
151
|
|
|
|
152
|
|
|
/** |
153
|
|
|
* Устанавливает флаг определяющий нужно вызвать метод или сервис, с целью подготовки данных, которые в дальнейшем |
154
|
|
|
* передаются в workflow |
155
|
|
|
* |
156
|
|
|
* @param boolean $flagRunPrepareData |
157
|
|
|
* |
158
|
|
|
* @return $this |
159
|
|
|
*/ |
160
|
|
|
public function setFlagRunPrepareData($flagRunPrepareData) |
161
|
|
|
{ |
162
|
|
|
$this->flagRunPrepareData = (boolean)$flagRunPrepareData; |
163
|
|
|
|
164
|
|
|
return $this; |
165
|
|
|
} |
166
|
|
|
|
167
|
|
|
/** |
168
|
|
|
* Значение определяет что является обработчиком подготавливающим данные (метод контроллера, сервис и т.д.) |
169
|
|
|
* |
170
|
|
|
* @return string |
171
|
|
|
*/ |
172
|
|
|
public function getPrepareDataMethod() |
173
|
|
|
{ |
174
|
|
|
return $this->prepareDataMethod; |
175
|
|
|
} |
176
|
|
|
|
177
|
|
|
/** |
178
|
|
|
* Устанавливает значение определяющие что является обработчиком подготавливающим данные |
179
|
|
|
* (метод контроллера, сервис и т.д.) |
180
|
|
|
* |
181
|
|
|
* @param string $prepareDataMethod |
182
|
|
|
* |
183
|
|
|
* @return $this |
184
|
|
|
* |
185
|
|
|
* @throws Exception\InvalidMetadataException |
186
|
|
|
*/ |
187
|
|
View Code Duplication |
public function setPrepareDataMethod($prepareDataMethod) |
|
|
|
|
188
|
|
|
{ |
189
|
|
|
if (!array_key_exists($prepareDataMethod, $this->allowPrepareDataMethod)) { |
190
|
|
|
$errMsg = sprintf('Not allowed prepare data method %s', $prepareDataMethod); |
191
|
|
|
throw new Exception\InvalidMetadataException($errMsg); |
192
|
|
|
} |
193
|
|
|
$this->prepareDataMethod = (string)$prepareDataMethod; |
194
|
|
|
|
195
|
|
|
return $this; |
196
|
|
|
} |
197
|
|
|
|
198
|
|
|
/** |
199
|
|
|
* Строка содержащая имя обработчика (имя метода контроллера или имя сервиса) в котором происходит подготовка данных |
200
|
|
|
* |
201
|
|
|
* @return string |
202
|
|
|
*/ |
203
|
|
|
public function getPrepareDataHandler() |
204
|
|
|
{ |
205
|
|
|
return $this->prepareDataHandler; |
206
|
|
|
} |
207
|
|
|
|
208
|
|
|
/** |
209
|
|
|
* Устанавлвивает строку содержащую имя обработчика (имя метода контроллера или имя сервиса) |
210
|
|
|
* в котором происходит подготовка данных |
211
|
|
|
* |
212
|
|
|
* @param string $prepareDataHandler |
213
|
|
|
* |
214
|
|
|
* @return $this |
215
|
|
|
*/ |
216
|
|
|
public function setPrepareDataHandler($prepareDataHandler) |
217
|
|
|
{ |
218
|
|
|
$this->prepareDataHandler = (string)$prepareDataHandler; |
219
|
|
|
|
220
|
|
|
return $this; |
221
|
|
|
} |
222
|
|
|
|
223
|
|
|
/** |
224
|
|
|
* Флаг указывает на то что есть условия для запуска workflow |
225
|
|
|
* |
226
|
|
|
* @return boolean |
227
|
|
|
*/ |
228
|
|
|
public function getFlagHasConditions() |
229
|
|
|
{ |
230
|
|
|
return $this->flagHasConditions; |
231
|
|
|
} |
232
|
|
|
|
233
|
|
|
/** |
234
|
|
|
* Устанавливает флаг указываеющий на то что есть условия для запуска workflow |
235
|
|
|
* |
236
|
|
|
* @param boolean $flagHasConditions |
237
|
|
|
* |
238
|
|
|
* @return $this |
239
|
|
|
*/ |
240
|
|
|
public function setFlagHasConditions($flagHasConditions) |
241
|
|
|
{ |
242
|
|
|
$this->flagHasConditions = (boolean)$flagHasConditions; |
243
|
|
|
|
244
|
|
|
return $this; |
245
|
|
|
} |
246
|
|
|
|
247
|
|
|
/** |
248
|
|
|
* Возвращает метаданные, содержащии информацию о том как вызвать условия, для проверка нужно ли запускать workflow |
249
|
|
|
* |
250
|
|
|
* @return DispatchConditionMetadata[]|SplObjectStorage |
251
|
|
|
*/ |
252
|
|
|
public function getConditions() |
253
|
|
|
{ |
254
|
|
|
return $this->conditions; |
255
|
|
|
} |
256
|
|
|
|
257
|
|
|
/** |
258
|
|
|
* Добавляет метаданные, содержащии информацию о том как вызвать условия, для проверка нужно ли запускать workflow |
259
|
|
|
* |
260
|
|
|
* @param DispatchConditionMetadata $condition |
261
|
|
|
* |
262
|
|
|
* @return $this |
263
|
|
|
*/ |
264
|
|
|
public function addConditions(DispatchConditionMetadata $condition) |
265
|
|
|
{ |
266
|
|
|
if (!$this->conditions->contains($condition)) { |
267
|
|
|
$this->conditions->attach($condition); |
268
|
|
|
} |
269
|
|
|
return $this; |
270
|
|
|
} |
271
|
|
|
|
272
|
|
|
/** |
273
|
|
|
* Проверка метаданных |
274
|
|
|
* |
275
|
|
|
* @throws Exception\InvalidMetadataException |
276
|
|
|
*/ |
277
|
|
|
public function validate() |
278
|
|
|
{ |
279
|
|
|
if ($this->isWorkflowDispatch() && null === $this->getWorkflowRunType()) { |
280
|
|
|
$errMsg = 'workflowRunType not specified'; |
281
|
|
|
throw new Exception\InvalidMetadataException($errMsg); |
282
|
|
|
} |
283
|
|
|
|
284
|
|
|
if ($this->isFlagRunPrepareData()) { |
285
|
|
|
if (null === $this->getPrepareDataMethod()) { |
286
|
|
|
$errMsg = 'prepareDataMethod not specified'; |
287
|
|
|
throw new Exception\InvalidMetadataException($errMsg); |
288
|
|
|
} |
289
|
|
|
if (null === $this->getPrepareDataMethod()) { |
290
|
|
|
$errMsg = 'prepareDataMethod not specified'; |
291
|
|
|
throw new Exception\InvalidMetadataException($errMsg); |
292
|
|
|
} |
293
|
|
|
} |
294
|
|
|
|
295
|
|
|
if ($this->getFlagHasConditions()) { |
296
|
|
|
if (0 === count($this->getConditions())) { |
297
|
|
|
$errMsg = 'empty conditions'; |
298
|
|
|
throw new Exception\InvalidMetadataException($errMsg); |
299
|
|
|
} |
300
|
|
|
|
301
|
|
|
foreach ($this->getConditions() as $condition) { |
302
|
|
|
$condition->validate(); |
303
|
|
|
} |
304
|
|
|
} |
305
|
|
|
} |
306
|
|
|
} |
307
|
|
|
|
Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.
You can also find more detailed suggestions in the “Code” section of your repository.