Loudmouth::__construct()   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 10
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 4
c 1
b 0
f 0
dl 0
loc 10
rs 10
cc 1
nc 1
nop 4
1
<?php
2
3
declare(strict_types=1);
4
5
namespace ReliqArts\Logistiq\Tracking\Listeners;
6
7
use ReliqArts\Logistiq\Tracking\Contracts\EventCreator;
8
use ReliqArts\Logistiq\Tracking\Events\StatusChanged;
9
use ReliqArts\Logistiq\Tracking\Exceptions\TrackableEventCreationFailed;
10
use ReliqArts\Logistiq\Utility\Contracts\ConfigProvider;
11
use ReliqArts\Logistiq\Utility\Contracts\EventDispatcher;
12
use ReliqArts\Logistiq\Utility\Contracts\Logger;
13
14
final class Loudmouth
15
{
16
    /**
17
     * @var Logger
18
     */
19
    private $logger;
20
21
    /**
22
     * @var ConfigProvider
23
     */
24
    private $configProvider;
25
26
    /**
27
     * @var EventCreator
28
     */
29
    private $eventCreator;
30
31
    /**
32
     * @var EventDispatcher
33
     */
34
    private $eventDispatcher;
35
36
    /**
37
     * Resonator constructor.
38
     *
39
     * @param Logger          $logger
40
     * @param ConfigProvider  $configProvider
41
     * @param EventCreator    $eventCreator
42
     * @param EventDispatcher $eventDispatcher
43
     */
44
    public function __construct(
45
        Logger $logger,
46
        ConfigProvider $configProvider,
47
        EventCreator $eventCreator,
48
        EventDispatcher $eventDispatcher
49
    ) {
50
        $this->logger = $logger;
51
        $this->configProvider = $configProvider;
52
        $this->eventCreator = $eventCreator;
53
        $this->eventDispatcher = $eventDispatcher;
54
    }
55
56
    /**
57
     * @param StatusChanged $event
58
     */
59
    public function handle(StatusChanged $event): void
60
    {
61
        $this->dispatchStatusEvents($event);
62
    }
63
64
    /**
65
     * Dispatch configured status-dependent events.
66
     *
67
     * @param StatusChanged $event
68
     */
69
    private function dispatchStatusEvents(StatusChanged $event): void
70
    {
71
        $status = $event->getStatus();
72
        $eventNamesForStatus = $this->configProvider->getEventsForStatus((string)$status->getIdentifier());
73
74
        foreach ($eventNamesForStatus as $nextEventClassName) {
75
            try {
76
                $nextEvent = $this->eventCreator->createForTrackable($nextEventClassName, $event->getTrackable());
77
78
                $this->eventDispatcher->dispatch($nextEvent);
79
            } catch (TrackableEventCreationFailed $exception) {
80
                $this->logger->error(
81
                    sprintf('Failed to dispatch event: `%s`. %s', $nextEventClassName, $exception->getMessage()),
82
                    $exception->getTrace()
83
                );
84
            }
85
        }
86
    }
87
}
88