GitHub Access Token became invalid

It seems like the GitHub access token used for retrieving details about this repository from GitHub became invalid. This might prevent certain types of inspections from being run (in particular, everything related to pull requests).
Please ask an admin of your repository to re-new the access token on this website.
Completed
Push — master ( 7335de...98e7aa )
by Андрей
02:22
created

Workflow::setWorkflowManagerServiceNamePattern()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 6
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
c 1
b 0
f 0
dl 0
loc 6
rs 9.4285
cc 1
eloc 3
nc 1
nop 1
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);
0 ignored issues
show
Unused Code Comprehensibility introduced by
65% of this comment could be valid code. Did you maybe forget this after debugging?

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.

Loading history...
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) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

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.

Loading history...
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) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

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.

Loading history...
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