Skip to content

Commit 504c9bd

Browse files
committed
Setup symfony implementation
1 parent 9755287 commit 504c9bd

File tree

4 files changed

+123
-1
lines changed

4 files changed

+123
-1
lines changed

composer.json

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
],
2121
"require": {
2222
"php": "^8.3",
23+
"gember/event-sourcing": "dev-main",
2324
"symfony/serializer": "^7.0"
2425
},
2526
"require-dev": {
@@ -28,7 +29,8 @@
2829
"phpstan/phpstan": "^1.11",
2930
"phpunit/phpunit": "^11.1",
3031
"rregeer/phpunit-coverage-check": "^0.3.1",
31-
"shipmonk/composer-dependency-analyser": "^1.5"
32+
"shipmonk/composer-dependency-analyser": "^1.5",
33+
"symfony/property-access": "^7.0"
3234
},
3335
"autoload": {
3436
"psr-4": {

src/SymfonySerializer.php

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Gember\SerializerSymfony;
6+
7+
use Gember\EventSourcing\Util\Serialization\Serializer\Serializer;
8+
use Symfony\Component\Serializer\Encoder\JsonEncoder;
9+
use Symfony\Component\Serializer\SerializerInterface;
10+
11+
final readonly class SymfonySerializer implements Serializer
12+
{
13+
public function __construct(
14+
private SerializerInterface $serializer,
15+
) {}
16+
17+
public function serialize(object $object): string
18+
{
19+
return $this->serializer->serialize($object, JsonEncoder::FORMAT);
20+
}
21+
22+
public function deserialize(string $payload, string $className): object
23+
{
24+
/** @var object */
25+
return $this->serializer->deserialize($payload, $className, JsonEncoder::FORMAT);
26+
}
27+
}

tests/SymfonySerializerTest.php

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Gember\SerializerSymfony\Test;
6+
7+
use DateTimeImmutable;
8+
use DateTimeZone;
9+
use Gember\SerializerSymfony\SymfonySerializer;
10+
use Gember\SerializerSymfony\Test\TestDoubles\TestDto;
11+
use PHPUnit\Framework\Attributes\Test;
12+
use PHPUnit\Framework\TestCase;
13+
use Symfony\Component\Serializer\Encoder\JsonEncoder;
14+
use Symfony\Component\Serializer\Normalizer\DateTimeNormalizer;
15+
use Symfony\Component\Serializer\Normalizer\ObjectNormalizer;
16+
use Symfony\Component\Serializer\Serializer;
17+
18+
/**
19+
* @internal
20+
*/
21+
final class SymfonySerializerTest extends TestCase
22+
{
23+
private SymfonySerializer $serializer;
24+
25+
protected function setUp(): void
26+
{
27+
parent::setUp();
28+
29+
$this->serializer = new SymfonySerializer(
30+
new Serializer(
31+
[
32+
new DateTimeNormalizer([DateTimeNormalizer::FORMAT_KEY => 'Y-m-d\TH:i:s.uP']),
33+
new ObjectNormalizer(),
34+
],
35+
[
36+
new JsonEncoder(),
37+
],
38+
),
39+
);
40+
}
41+
42+
#[Test]
43+
public function itShouldSerializeObjectIntoPayload(): void
44+
{
45+
$serialized = $this->serializer->serialize(new TestDto(
46+
'da11f500-ab9b-49e6-96eb-83b9f3669a47',
47+
1234,
48+
23.500,
49+
new DateTimeImmutable('2024-05-29 10:30:00.345654', new DateTimeZone('America/Los_Angeles')),
50+
));
51+
52+
self::assertSame(
53+
'{"id":"da11f500-ab9b-49e6-96eb-83b9f3669a47","integer":1234,"float":23.5,"dateTimeImmutable":"2024-05-29T10:30:00.345654-07:00"}',
54+
$serialized,
55+
);
56+
}
57+
58+
#[Test]
59+
public function itShouldDeserializePayloadIntoObject(): void
60+
{
61+
$dto = $this->serializer->deserialize(
62+
'{"id":"da11f500-ab9b-49e6-96eb-83b9f3669a47","integer":1234,"float":23.5,"dateTimeImmutable":"2024-05-29T10:30:00.345654-07:00"}',
63+
TestDto::class,
64+
);
65+
66+
self::assertEquals(
67+
new TestDto(
68+
'da11f500-ab9b-49e6-96eb-83b9f3669a47',
69+
1234,
70+
23.500,
71+
new DateTimeImmutable('2024-05-29 10:30:00.345654', new DateTimeZone('America/Los_Angeles')),
72+
),
73+
$dto,
74+
);
75+
}
76+
}

tests/TestDoubles/TestDto.php

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Gember\SerializerSymfony\Test\TestDoubles;
6+
7+
use DateTimeImmutable;
8+
9+
final readonly class TestDto
10+
{
11+
public function __construct(
12+
public string $id,
13+
public int $integer,
14+
public float $float,
15+
public DateTimeImmutable $dateTimeImmutable,
16+
) {}
17+
}

0 commit comments

Comments
 (0)