PersistsMessages::shouldPersistMessage()   A
last analyzed

Complexity

Conditions 4
Paths 5

Size

Total Lines 5
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 5
rs 9.2
c 0
b 0
f 0
cc 4
eloc 3
nc 5
nop 1
1
<?php
2
3
declare (strict_types = 1);
4
5
namespace HMLB\DDDBundle\MessageBus\Middleware;
6
7
use Doctrine\Common\Persistence\ObjectManager;
8
use HMLB\DDD\Exception\PersistentMessageWithoutIdentityException;
9
use HMLB\DDD\Message\Command\Command;
10
use HMLB\DDD\Message\Event\Event;
11
use HMLB\DDD\Message\Message;
12
use HMLB\DDD\Persistence\PersistentMessage;
13
use Psr\Log\LoggerInterface;
14
use SimpleBus\Message\Bus\Middleware\MessageBusMiddleware;
15
16
/**
17
 * Adds messages to object manager persistence.
18
 *
19
 * @author Hugues Maignol <[email protected]>
20
 */
21
class PersistsMessages implements MessageBusMiddleware
22
{
23
    /**
24
     * @var ObjectManager
25
     */
26
    private $om;
27
28
    /**
29
     * @var LoggerInterface
30
     */
31
    private $logger;
32
33
    /**
34
     * @var bool
35
     */
36
    private $persistCommands;
37
38
    /**
39
     * @var bool
40
     */
41
    private $persistEvents;
42
43
    /**
44
     * PersistsMessages constructor.
45
     *
46
     * @param LoggerInterface $logger
47
     * @param ObjectManager   $om
48
     * @param bool            $persistCommands
49
     * @param bool            $persistEvents
50
     */
51
    public function __construct(LoggerInterface $logger, ObjectManager $om, bool $persistCommands, bool $persistEvents)
52
    {
53
        $this->logger = $logger;
54
        $this->om = $om;
55
        $this->persistCommands = $persistCommands;
56
        $this->persistEvents = $persistEvents;
57
    }
58
59
    /**
60
     * @param Message  $message
61
     * @param callable $next
62
     */
63
    public function handle($message, callable $next)
64
    {
65
        if ($message instanceof PersistentMessage && $this->shouldPersistMessage($message)) {
66
            $this->logger->debug('PersistsMessage persisting '.get_class($message));
67
            try {
68
                $message->getId();
69
            } catch (PersistentMessageWithoutIdentityException $e) {
70
                $message->initializeId();
71
            }
72
73
            $this->om->persist($message);
74
        }
75
76
        $next($message);
77
    }
78
79
    /**
80
     * @param PersistentMessage $message
81
     *
82
     * @return bool
83
     */
84
    private function shouldPersistMessage(PersistentMessage $message): bool
85
    {
86
        return ($message instanceof Command && $this->persistCommands) ||
87
        ($message instanceof Event && $this->persistEvents);
88
    }
89
}
90