1
|
|
|
<?php |
2
|
|
|
/** |
3
|
|
|
* @link https://github.com/old-town/workflow-zf2 |
4
|
|
|
* @author Malofeykin Andrey <[email protected]> |
5
|
|
|
*/ |
6
|
|
|
namespace OldTown\Workflow\ZF2\ServiceEngine; |
7
|
|
|
|
8
|
|
|
use OldTown\Workflow\Loader\WorkflowDescriptor; |
9
|
|
|
use OldTown\Workflow\TransientVars\TransientVarsInterface; |
10
|
|
|
use OldTown\Workflow\WorkflowInterface; |
11
|
|
|
use Zend\EventManager\EventManagerAwareTrait; |
12
|
|
|
use Zend\ServiceManager\ServiceLocatorAwareTrait; |
13
|
|
|
use Traversable; |
14
|
|
|
use Zend\Stdlib\ArrayUtils; |
15
|
|
|
use OldTown\Workflow\TransientVars\BaseTransientVars; |
16
|
|
|
use OldTown\Workflow\ZF2\Event\WorkflowEvent; |
17
|
|
|
use OldTown\Workflow\ZF2\ServiceEngine\Workflow\TransitionResult; |
18
|
|
|
use OldTown\Workflow\ZF2\ServiceEngine\Workflow\TransitionResultInterface; |
19
|
|
|
use OldTown\Workflow\ZF2\Options\ModuleOptions; |
20
|
|
|
use OldTown\Workflow\Loader\ActionDescriptor; |
21
|
|
|
|
22
|
|
|
/** |
23
|
|
|
* Class Workflow |
24
|
|
|
* |
25
|
|
|
* @package OldTown\Workflow\ZF2\ServiceEngine |
26
|
|
|
*/ |
27
|
|
|
class Workflow implements WorkflowServiceInterface |
28
|
|
|
{ |
29
|
|
|
use ServiceLocatorAwareTrait, EventManagerAwareTrait; |
30
|
|
|
|
31
|
|
|
/** |
32
|
|
|
* Паттерн для получения имени сервиса workflow |
33
|
|
|
* |
34
|
|
|
* @var string |
35
|
|
|
*/ |
36
|
|
|
protected $workflowManagerServiceNamePattern = 'workflow.manager.%s'; |
37
|
|
|
|
38
|
|
|
/** |
39
|
|
|
* Конфигурация модуля |
40
|
|
|
* |
41
|
|
|
* @var ModuleOptions |
42
|
|
|
*/ |
43
|
|
|
protected $moduleOptions; |
44
|
|
|
|
45
|
|
|
/** |
46
|
|
|
* @param $options |
47
|
|
|
* |
48
|
|
|
* @throws \Zend\Stdlib\Exception\InvalidArgumentException |
49
|
|
|
* @throws \OldTown\Workflow\ZF2\Service\Exception\InvalidArgumentException |
50
|
|
|
* @throws \OldTown\Workflow\ZF2\ServiceEngine\Exception\InvalidArgumentException |
51
|
|
|
*/ |
52
|
|
|
public function __construct($options) |
53
|
|
|
{ |
54
|
|
|
$this->init($options); |
55
|
|
|
} |
56
|
|
|
|
57
|
|
|
/** |
58
|
|
|
* Инициализация сервиса |
59
|
|
|
* |
60
|
|
|
* @param $options |
61
|
|
|
* |
62
|
|
|
* @throws \Zend\Stdlib\Exception\InvalidArgumentException |
63
|
|
|
* @throws \OldTown\Workflow\ZF2\Service\Exception\InvalidArgumentException |
64
|
|
|
* @throws \OldTown\Workflow\ZF2\ServiceEngine\Exception\InvalidArgumentException |
65
|
|
|
*/ |
66
|
|
|
protected function init($options) |
67
|
|
|
{ |
68
|
|
|
if ($options instanceof Traversable) { |
69
|
|
|
$options = ArrayUtils::iteratorToArray($options); |
70
|
|
|
} elseif (!is_array($options)) { |
71
|
|
|
$errMsg = sprintf('%s expects an array or Traversable config', __METHOD__); |
72
|
|
|
throw new Exception\InvalidArgumentException($errMsg); |
73
|
|
|
} |
74
|
|
|
|
75
|
|
|
if (!array_key_exists('serviceLocator', $options)) { |
76
|
|
|
$errMsg = 'Argument serviceLocator not found'; |
77
|
|
|
throw new Exception\InvalidArgumentException($errMsg); |
78
|
|
|
} |
79
|
|
|
$this->setServiceLocator($options['serviceLocator']); |
80
|
|
|
|
81
|
|
|
if (!array_key_exists('moduleOptions', $options)) { |
82
|
|
|
$errMsg = 'Argument moduleOptions not found'; |
83
|
|
|
throw new Exception\InvalidArgumentException($errMsg); |
84
|
|
|
} |
85
|
|
|
$this->setModuleOptions($options['moduleOptions']); |
86
|
|
|
} |
87
|
|
|
|
88
|
|
|
/** |
89
|
|
|
* Запуск перехода из отдного состояния в другое |
90
|
|
|
* |
91
|
|
|
* @param $managerName |
92
|
|
|
* @param $entryId |
93
|
|
|
* @param $actionName |
94
|
|
|
* |
95
|
|
|
* @param TransientVarsInterface $transientVars |
96
|
|
|
* |
97
|
|
|
* @return TransitionResultInterface |
98
|
|
|
* |
99
|
|
|
* @throws \OldTown\Workflow\ZF2\ServiceEngine\Exception\DoActionException |
100
|
|
|
*/ |
101
|
|
|
public function doAction($managerName, $entryId, $actionName, TransientVarsInterface $transientVars = null) |
102
|
|
|
{ |
103
|
|
|
try { |
104
|
|
|
$event = new WorkflowEvent(); |
105
|
|
|
$event->setTarget($this); |
106
|
|
|
$event->setEntryId($entryId); |
107
|
|
|
|
108
|
|
|
$manager = $this->getWorkflowManager($managerName); |
109
|
|
|
$event->setWorkflowManager($manager); |
110
|
|
|
|
111
|
|
|
$workflowStore = $manager->getConfiguration()->getWorkflowStore(); |
112
|
|
|
|
113
|
|
|
$entry = $workflowStore->findEntry($entryId); |
114
|
|
|
$workflowName = $entry->getWorkflowName(); |
115
|
|
|
|
116
|
|
|
$wf = $manager->getConfiguration()->getWorkflow($workflowName); |
117
|
|
|
$event->setWorkflow($wf); |
118
|
|
|
|
119
|
|
|
//$action = $this->getActionByName($wf, $actionName); |
|
|
|
|
120
|
|
|
$action = $this->findActionByNameForEntry($managerName, $entryId, $actionName); |
121
|
|
|
|
122
|
|
|
|
123
|
|
|
$actionId = $action->getId(); |
124
|
|
|
|
125
|
|
|
if (null === $transientVars) { |
126
|
|
|
$transientVars = new BaseTransientVars(); |
127
|
|
|
} |
128
|
|
|
|
129
|
|
|
$event->setTransientVars($transientVars); |
130
|
|
|
|
131
|
|
|
$manager->doAction($entryId, $actionId, $transientVars); |
132
|
|
|
|
133
|
|
|
$this->getEventManager()->trigger(WorkflowEvent::EVENT_DO_ACTION, $this, $event); |
134
|
|
|
|
135
|
|
|
$viewName = $action->getView(); |
136
|
|
View Code Duplication |
if (null !== $viewName) { |
|
|
|
|
137
|
|
|
$event->setViewName($viewName); |
138
|
|
|
$event->setName(WorkflowEvent::EVENT_RENDER); |
139
|
|
|
$this->getEventManager()->trigger($event); |
140
|
|
|
} |
141
|
|
|
} catch (\Exception $e) { |
142
|
|
|
throw new Exception\DoActionException($e->getMessage(), $e->getCode(), $e); |
143
|
|
|
} |
144
|
|
|
|
145
|
|
|
$result = new TransitionResult($entryId, $manager, $wf, $transientVars); |
146
|
|
|
if ($viewName) { |
147
|
|
|
$result->setViewName($viewName); |
148
|
|
|
} |
149
|
|
|
|
150
|
|
|
return $result; |
151
|
|
|
} |
152
|
|
|
|
153
|
|
|
/** |
154
|
|
|
* Возвращает доступные действия для текущего состояния процесса |
155
|
|
|
* |
156
|
|
|
* @param $managerName |
157
|
|
|
* @param $entryId |
158
|
|
|
* |
159
|
|
|
* @return array|ActionDescriptor[] |
160
|
|
|
* |
161
|
|
|
* @throws \OldTown\Workflow\ZF2\ServiceEngine\Exception\InvalidManagerNameException |
162
|
|
|
* @throws \Zend\ServiceManager\Exception\ServiceNotFoundException |
163
|
|
|
* @throws \OldTown\Workflow\ZF2\ServiceEngine\Exception\InvalidWorkflowManagerException |
164
|
|
|
* @throws \OldTown\Workflow\Exception\ArgumentNotNumericException |
165
|
|
|
*/ |
166
|
|
|
public function getAvailableActions($managerName, $entryId) |
167
|
|
|
{ |
168
|
|
|
$manager = $this->getWorkflowManager($managerName); |
169
|
|
|
$currentSteps = $manager->getCurrentSteps($entryId); |
170
|
|
|
|
171
|
|
|
$entry = $manager->getConfiguration()->getWorkflowStore()->findEntry($entryId); |
172
|
|
|
$workflowName = $entry->getWorkflowName(); |
173
|
|
|
|
174
|
|
|
$wf = $manager->getConfiguration()->getWorkflow($workflowName); |
175
|
|
|
|
176
|
|
|
$findActions = []; |
177
|
|
|
foreach ($currentSteps as $currentStep) { |
178
|
|
|
$stepId = $currentStep->getStepId(); |
179
|
|
|
$step = $wf->getStep($stepId); |
180
|
|
|
$actions = $step->getActions(); |
181
|
|
|
|
182
|
|
|
foreach ($actions as $action) { |
183
|
|
|
$findActions[] = $action; |
184
|
|
|
} |
185
|
|
|
} |
186
|
|
|
|
187
|
|
|
return $findActions; |
188
|
|
|
} |
189
|
|
|
|
190
|
|
|
|
191
|
|
|
/** |
192
|
|
|
* Ишет действие по имени. Поиск происходит в рамках текущего step'a. |
193
|
|
|
* |
194
|
|
|
* @param $managerName |
195
|
|
|
* @param $entryId |
196
|
|
|
* @param $actionName |
197
|
|
|
* |
198
|
|
|
* @return ActionDescriptor|null |
199
|
|
|
* |
200
|
|
|
* @throws \OldTown\Workflow\ZF2\ServiceEngine\Exception\InvalidManagerNameException |
201
|
|
|
* @throws \Zend\ServiceManager\Exception\ServiceNotFoundException |
202
|
|
|
* @throws \OldTown\Workflow\ZF2\ServiceEngine\Exception\InvalidWorkflowManagerException |
203
|
|
|
* @throws \OldTown\Workflow\Exception\ArgumentNotNumericException |
204
|
|
|
* @throws \OldTown\Workflow\ZF2\ServiceEngine\Exception\InvalidWorkflowActionNameException |
205
|
|
|
* @throws \OldTown\Workflow\Exception\FactoryException |
206
|
|
|
*/ |
207
|
|
|
public function findActionByNameForEntry($managerName, $entryId, $actionName) |
208
|
|
|
{ |
209
|
|
|
$actions = $this->getAvailableActions($managerName, $entryId); |
210
|
|
|
$findActions = []; |
211
|
|
|
foreach ($actions as $action) { |
212
|
|
|
if ($actionName === $action->getName()) { |
213
|
|
|
$findActions[] = $action; |
214
|
|
|
} |
215
|
|
|
} |
216
|
|
|
|
217
|
|
|
|
218
|
|
|
$countActions = count($findActions); |
219
|
|
|
if ($countActions > 1) { |
220
|
|
|
$errMsg = sprintf( |
221
|
|
|
'Found more than one action workflow. Manager name: %s. Name action: %s. Ids: %s', |
222
|
|
|
$managerName, |
223
|
|
|
$actionName, |
224
|
|
|
implode(',', array_map(function ($action) { |
225
|
|
|
return is_object($action) && method_exists($action, 'getId') ? call_user_func([$action, 'getId']) : ''; |
226
|
|
|
}, $findActions)) |
227
|
|
|
); |
228
|
|
|
|
229
|
|
|
throw new Exception\InvalidWorkflowActionNameException($errMsg); |
230
|
|
|
} |
231
|
|
|
$findAction = null; |
232
|
|
|
if (1 === $countActions) { |
233
|
|
|
reset($findActions); |
234
|
|
|
$findAction = current($findActions); |
235
|
|
|
} |
236
|
|
|
return $findAction; |
237
|
|
|
} |
238
|
|
|
|
239
|
|
|
/** |
240
|
|
|
* Создание процесса workflow |
241
|
|
|
* |
242
|
|
|
* @param $managerName |
243
|
|
|
* @param $workflowName |
244
|
|
|
* @param $actionName |
245
|
|
|
* |
246
|
|
|
* @param TransientVarsInterface $transientVars |
247
|
|
|
* |
248
|
|
|
* @return TransitionResultInterface |
249
|
|
|
* |
250
|
|
|
* @throws \OldTown\Workflow\ZF2\ServiceEngine\Exception\InvalidInitializeWorkflowEntryException |
251
|
|
|
*/ |
252
|
|
|
public function initialize($managerName, $workflowName, $actionName, TransientVarsInterface $transientVars = null) |
253
|
|
|
{ |
254
|
|
|
try { |
255
|
|
|
$event = new WorkflowEvent(); |
256
|
|
|
$event->setTarget($this); |
257
|
|
|
|
258
|
|
|
$manager = $this->getWorkflowManager($managerName); |
259
|
|
|
$event->setWorkflowManager($manager); |
260
|
|
|
$wf = $manager->getConfiguration()->getWorkflow($workflowName); |
261
|
|
|
$event->setWorkflow($wf); |
262
|
|
|
|
263
|
|
|
$actionId = null; |
264
|
|
|
$initialActions = $wf->getInitialActions(); |
265
|
|
|
|
266
|
|
|
foreach ($initialActions as $initialAction) { |
267
|
|
|
if ($actionName === $initialAction->getName()) { |
268
|
|
|
$actionId = $initialAction->getId(); |
269
|
|
|
break; |
270
|
|
|
} |
271
|
|
|
} |
272
|
|
|
|
273
|
|
|
if (null === $actionId) { |
274
|
|
|
$errMsg = sprintf('Action %s not found', $actionName); |
275
|
|
|
throw new Exception\ActionNotFoundException($errMsg); |
276
|
|
|
} |
277
|
|
|
|
278
|
|
|
if (null === $transientVars) { |
279
|
|
|
$transientVars = new BaseTransientVars(); |
280
|
|
|
} |
281
|
|
|
$event->setTransientVars($transientVars); |
282
|
|
|
$entryId = $manager->initialize($workflowName, $actionId, $transientVars); |
283
|
|
|
$event->setEntryId($entryId); |
284
|
|
|
|
285
|
|
|
$this->getEventManager()->trigger(WorkflowEvent::EVENT_WORKFLOW_INITIALIZE, $this, $event); |
286
|
|
|
|
287
|
|
|
|
288
|
|
|
$initialActions = $wf->getInitialAction($actionId); |
289
|
|
|
$viewName = $initialActions->getView(); |
290
|
|
View Code Duplication |
if (null !== $viewName) { |
|
|
|
|
291
|
|
|
$event->setViewName($viewName); |
292
|
|
|
$event->setName(WorkflowEvent::EVENT_RENDER); |
293
|
|
|
$this->getEventManager()->trigger($event); |
294
|
|
|
} |
295
|
|
|
} catch (\Exception $e) { |
296
|
|
|
throw new Exception\InvalidInitializeWorkflowEntryException($e->getMessage(), $e->getCode(), $e); |
297
|
|
|
} |
298
|
|
|
|
299
|
|
|
$result = new TransitionResult($entryId, $manager, $wf, $transientVars); |
300
|
|
|
if ($viewName) { |
301
|
|
|
$result->setViewName($viewName); |
302
|
|
|
} |
303
|
|
|
|
304
|
|
|
return $result; |
305
|
|
|
} |
306
|
|
|
|
307
|
|
|
/** |
308
|
|
|
* Конфигурация модуля |
309
|
|
|
* |
310
|
|
|
* @return ModuleOptions |
311
|
|
|
*/ |
312
|
|
|
public function getModuleOptions() |
313
|
|
|
{ |
314
|
|
|
return $this->moduleOptions; |
315
|
|
|
} |
316
|
|
|
|
317
|
|
|
/** |
318
|
|
|
* Устанавливает конфигурацию модуля |
319
|
|
|
* |
320
|
|
|
* @param ModuleOptions $moduleOptions |
321
|
|
|
* |
322
|
|
|
* @return $this |
323
|
|
|
*/ |
324
|
|
|
public function setModuleOptions(ModuleOptions $moduleOptions) |
325
|
|
|
{ |
326
|
|
|
$this->moduleOptions = $moduleOptions; |
327
|
|
|
|
328
|
|
|
return $this; |
329
|
|
|
} |
330
|
|
|
|
331
|
|
|
|
332
|
|
|
|
333
|
|
|
/** |
334
|
|
|
* Получение менеджера workflow по имени |
335
|
|
|
* |
336
|
|
|
* @param string $managerName |
337
|
|
|
* |
338
|
|
|
* @return WorkflowInterface |
339
|
|
|
* |
340
|
|
|
* @throws \OldTown\Workflow\ZF2\ServiceEngine\Exception\InvalidManagerNameException |
341
|
|
|
* @throws \Zend\ServiceManager\Exception\ServiceNotFoundException |
342
|
|
|
* @throws \OldTown\Workflow\ZF2\ServiceEngine\Exception\InvalidWorkflowManagerException |
343
|
|
|
*/ |
344
|
|
|
public function getWorkflowManager($managerName) |
345
|
|
|
{ |
346
|
|
|
if (!$this->hasWorkflowManager($managerName)) { |
347
|
|
|
$errMsg = sprintf('Invalid workflow manager name %s', $managerName); |
348
|
|
|
throw new Exception\InvalidManagerNameException($errMsg); |
349
|
|
|
} |
350
|
|
|
$workflowManagerServiceName = $this->getWorkflowManagerServiceName($managerName); |
351
|
|
|
|
352
|
|
|
$manager = $this->getServiceLocator()->get($workflowManagerServiceName); |
353
|
|
|
|
354
|
|
|
if (!$manager instanceof WorkflowInterface) { |
355
|
|
|
$errMsg = sprintf('Workflow manager not implement %s', WorkflowInterface::class); |
356
|
|
|
throw new Exception\InvalidWorkflowManagerException($errMsg); |
357
|
|
|
} |
358
|
|
|
|
359
|
|
|
return $manager; |
360
|
|
|
} |
361
|
|
|
|
362
|
|
|
|
363
|
|
|
|
364
|
|
|
|
365
|
|
|
/** |
366
|
|
|
* @param WorkflowDescriptor $wf |
367
|
|
|
* @param $actionName |
368
|
|
|
* |
369
|
|
|
* @return null|ActionDescriptor |
370
|
|
|
*/ |
371
|
|
|
public function getActionByName(WorkflowDescriptor $wf, $actionName) |
372
|
|
|
{ |
373
|
|
|
$actionName = (string)$actionName; |
374
|
|
|
|
375
|
|
|
foreach ($wf->getGlobalActions() as $actionDescriptor) { |
376
|
|
|
if ($actionName === $actionDescriptor->getName()) { |
377
|
|
|
return $actionDescriptor; |
378
|
|
|
} |
379
|
|
|
} |
380
|
|
|
|
381
|
|
|
foreach ($wf->getSteps() as $stepDescriptor) { |
382
|
|
|
$actions = $stepDescriptor->getActions(); |
383
|
|
|
foreach ($actions as $actionDescriptor) { |
384
|
|
|
if ($actionName === $actionDescriptor->getName()) { |
385
|
|
|
return $actionDescriptor; |
386
|
|
|
} |
387
|
|
|
} |
388
|
|
|
} |
389
|
|
|
|
390
|
|
|
foreach ($wf->getInitialActions() as $actionDescriptor) { |
391
|
|
|
if ($actionName === $actionDescriptor->getName()) { |
392
|
|
|
return $actionDescriptor; |
393
|
|
|
} |
394
|
|
|
} |
395
|
|
|
|
396
|
|
|
return null; |
397
|
|
|
} |
398
|
|
|
|
399
|
|
|
/** |
400
|
|
|
* Проверят есть ли менеджер workflow с заданным именем |
401
|
|
|
* |
402
|
|
|
* @param string $workflowManagerName |
403
|
|
|
* |
404
|
|
|
* @return bool |
405
|
|
|
*/ |
406
|
|
|
public function hasWorkflowManager($workflowManagerName) |
407
|
|
|
{ |
408
|
|
|
$workflowManagerServiceName = $this->getWorkflowManagerServiceName($workflowManagerName); |
409
|
|
|
|
410
|
|
|
return $this->getServiceLocator()->has($workflowManagerServiceName); |
411
|
|
|
} |
412
|
|
|
|
413
|
|
|
/** |
414
|
|
|
* Имя сервиса для получения менеджера workflow |
415
|
|
|
* |
416
|
|
|
* @param string $workflowManagerName |
417
|
|
|
* |
418
|
|
|
* @return string |
419
|
|
|
*/ |
420
|
|
|
public function getWorkflowManagerServiceName($workflowManagerName) |
421
|
|
|
{ |
422
|
|
|
return sprintf($this->getWorkflowManagerServiceNamePattern(), $workflowManagerName); |
423
|
|
|
} |
424
|
|
|
|
425
|
|
|
/** |
426
|
|
|
* @return string |
427
|
|
|
*/ |
428
|
|
|
public function getWorkflowManagerServiceNamePattern() |
429
|
|
|
{ |
430
|
|
|
return $this->workflowManagerServiceNamePattern; |
431
|
|
|
} |
432
|
|
|
|
433
|
|
|
/** |
434
|
|
|
* @param string $workflowManagerServiceNamePattern |
435
|
|
|
* |
436
|
|
|
* @return $this |
437
|
|
|
*/ |
438
|
|
|
public function setWorkflowManagerServiceNamePattern($workflowManagerServiceNamePattern) |
439
|
|
|
{ |
440
|
|
|
$this->workflowManagerServiceNamePattern = (string)$workflowManagerServiceNamePattern; |
441
|
|
|
|
442
|
|
|
return $this; |
443
|
|
|
} |
444
|
|
|
|
445
|
|
|
/** |
446
|
|
|
* Возвращает имя менеджера по его пседовниму |
447
|
|
|
* |
448
|
|
|
* @param $alias |
449
|
|
|
* |
450
|
|
|
* @return string |
451
|
|
|
* |
452
|
|
|
* @throws Exception\InvalidWorkflowManagerAliasException |
453
|
|
|
*/ |
454
|
|
|
public function getManagerNameByAlias($alias) |
455
|
|
|
{ |
456
|
|
|
$aliasMap = $this->getModuleOptions()->getManagerAliases(); |
457
|
|
|
if (!array_key_exists($alias, $aliasMap)) { |
458
|
|
|
$errMsg = sprintf('Invalid workflow manager alias: %s', $alias); |
459
|
|
|
throw new Exception\InvalidWorkflowManagerAliasException($errMsg); |
460
|
|
|
} |
461
|
|
|
|
462
|
|
|
return $aliasMap[$alias]; |
463
|
|
|
} |
464
|
|
|
|
465
|
|
|
|
466
|
|
|
/** |
467
|
|
|
* Проверяет есть ли псевдоним для менеджера workflow |
468
|
|
|
* |
469
|
|
|
* @param string $alias |
470
|
|
|
* |
471
|
|
|
* @return boolean |
472
|
|
|
*/ |
473
|
|
|
public function hasWorkflowManagerAlias($alias) |
474
|
|
|
{ |
475
|
|
|
$aliasMap = $this->getModuleOptions()->getManagerAliases(); |
476
|
|
|
return array_key_exists($alias, $aliasMap); |
477
|
|
|
} |
478
|
|
|
|
479
|
|
|
/** |
480
|
|
|
* Получение менеджера workflow по его псевдониму |
481
|
|
|
* |
482
|
|
|
* @param $alias |
483
|
|
|
* |
484
|
|
|
* @return WorkflowInterface |
485
|
|
|
* |
486
|
|
|
* @throws Exception\InvalidWorkflowManagerAliasException |
487
|
|
|
* @throws \OldTown\Workflow\ZF2\ServiceEngine\Exception\InvalidManagerNameException |
488
|
|
|
* @throws \Zend\ServiceManager\Exception\ServiceNotFoundException |
489
|
|
|
* @throws \OldTown\Workflow\ZF2\ServiceEngine\Exception\InvalidWorkflowManagerException |
490
|
|
|
*/ |
491
|
|
|
public function getWorkflowManagerByAlias($alias) |
492
|
|
|
{ |
493
|
|
|
$name = $this->getManagerNameByAlias($alias); |
494
|
|
|
return $this->getWorkflowManager($name); |
495
|
|
|
} |
496
|
|
|
} |
497
|
|
|
|
Sometimes obsolete code just ends up commented out instead of removed. In this case it is better to remove the code once you have checked you do not need it.
The code might also have been commented out for debugging purposes. In this case it is vital that someone uncomments it again or your project may behave in very unexpected ways in production.
This check looks for comments that seem to be mostly valid code and reports them.