Completed
Push — master ( 708590...9c6d22 )
by Frank
02:26
created

Serialization/ConstructingMessageSerializer.php (1 issue)

Upgrade to new PHP Analysis Engine

These results are based on our legacy PHP analysis, consider migrating to our new PHP analysis engine instead. Learn more

1
<?php
2
3
declare(strict_types=1);
4
5
namespace EventSauce\EventSourcing\Serialization;
6
7
use EventSauce\EventSourcing\AggregateRootId;
8
use EventSauce\EventSourcing\ClassNameInflector;
9
use EventSauce\EventSourcing\DotSeparatedSnakeCaseInflector;
10
use EventSauce\EventSourcing\Event;
11
use EventSauce\EventSourcing\Header;
12
use EventSauce\EventSourcing\Message;
13
use Generator;
14
15
final class ConstructingMessageSerializer implements MessageSerializer
16
{
17
    /**
18
     * @var ClassNameInflector
19
     */
20
    private $classNameInflector;
21
22 14
    public function __construct(ClassNameInflector $classNameInflector = null)
23
    {
24 14
        $this->classNameInflector = $classNameInflector ?: new DotSeparatedSnakeCaseInflector();
25 14
    }
26
27 6
    public function serializeMessage(Message $message): array
28
    {
29 6
        $event = $message->event();
30 6
        $payload = $event->toPayload();
31 6
        $headers = $message->headers();
32
33 6
        if (isset($headers[Header::AGGREGATE_ROOT_ID]) && $headers[Header::AGGREGATE_ROOT_ID] instanceof AggregateRootId) {
34 5
            $headers[Header::AGGREGATE_ROOT_ID_TYPE] = $this->classNameInflector->instanceToType($headers[Header::AGGREGATE_ROOT_ID]);
35 5
            $headers[Header::AGGREGATE_ROOT_ID] = $headers[Header::AGGREGATE_ROOT_ID]->toString();
0 ignored issues
show
The method toString cannot be called on $headers[\EventSauce\Eve...der::AGGREGATE_ROOT_ID] (of type string).

Methods can only be called on objects. This check looks for methods being called on variables that have been inferred to never be objects.

Loading history...
36
        }
37
38
        return [
39 6
            'headers' => $headers,
40 6
            'payload' => $payload,
41
        ];
42
    }
43
44 7
    public function unserializePayload(array $payload): Generator
45
    {
46 7
        if (isset($payload['headers'][Header::AGGREGATE_ROOT_ID], $payload['headers'][Header::AGGREGATE_ROOT_ID_TYPE])) {
47
            /** @var AggregateRootId $aggregateRootIdClassName */
48 5
            $aggregateRootIdClassName = $this->classNameInflector->typeToClassName($payload['headers'][Header::AGGREGATE_ROOT_ID_TYPE]);
49 5
            $payload['headers'][Header::AGGREGATE_ROOT_ID] = $aggregateRootIdClassName::fromString($payload['headers'][Header::AGGREGATE_ROOT_ID]);
50
        }
51
52
        /** @var Event $className */
53 7
        $className = $this->classNameInflector->typeToClassName($payload['headers'][Header::EVENT_TYPE]);
54 7
        $event = $className::fromPayload($payload['payload']);
55
56 7
        yield new Message($event, $payload['headers']);
57 7
    }
58
}
59