Skip to content

Commit e2668e4

Browse files
authored
simple-normalizable_to-string (#18)
1 parent 6973a00 commit e2668e4

3 files changed

Lines changed: 59 additions & 15 deletions

File tree

README.md

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,8 @@ based messages (HTTP, AMQP, ...)
3131

3232
### Simple Normalization
3333

34-
If all object properties are scalar `or` ScalarableInterface `or` NormalizableInterface then:
34+
If all object properties are scalar `or` ScalarableInterface `or` NormalizableInterface `or` Stringable (
35+
has `__toString`) then:
3536
**SimpleNormalizableTrait** will do everything automatically
3637

3738
```php
@@ -139,7 +140,7 @@ use Era269\Normalizable\Adapter\ThrowableToNormalizableAdapter;
139140

140141
final class ExceptionNormalizer implements NormalizerInterface
141142
{
142-
public function normalize(object $object) : array
143+
public function normalize($object) : array
143144
{
144145
/** @var Throwable $object */
145146
return (new ThrowableToNormalizableAdapter($object))->normalize();
@@ -165,8 +166,9 @@ final class DomainEvent implements NormalizableInterface, DenormalizableInterfac
165166
{
166167
use AbstractNormalizableTrait;
167168

168-
private string $name;
169-
private DateTimeRfc3339Normalizable $createdAt;
169+
private $name;
170+
171+
private $createdAt;
170172

171173
public function __construct(string $name)
172174
{
@@ -181,7 +183,7 @@ final class DomainEvent implements NormalizableInterface, DenormalizableInterfac
181183
'createdAt' => $this->createdAt->normalize(),
182184
];
183185
}
184-
public static function denormalize(array $data) : static
186+
public static function denormalize(array $data) : static //since php 8.0
185187
{
186188
$self = new self($data['name']);
187189
$self->createdAt = DateTimeRfc3339Normalizable::denormalize($data);

src/Traits/SimpleNormalizableTrait.php

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,9 @@ private function extractScalar($value)
6363
case $value instanceof ScalarableInterface:
6464
return $value->toScalar();
6565

66+
case $this->isStringable($value):
67+
return (string) $value;
68+
6669
default:
6770
throw new LogicException(sprintf(
6871
'Value "%s", but MUST be scalar or implement any of [%s, %s]',
@@ -72,4 +75,12 @@ private function extractScalar($value)
7275
));
7376
}
7477
}
78+
79+
/**
80+
* @param object $value
81+
*/
82+
private function isStringable($value): bool
83+
{
84+
return method_exists($value, '__toString');
85+
}
7586
}

tests/Object/SimpleNormalizableTraitTest.php

Lines changed: 41 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
use Era269\Normalizable\Object\IntegerObject;
1212
use Era269\Normalizable\Object\StringObject;
1313
use Era269\Normalizable\Traits\SimpleNormalizableTrait;
14+
use Exception;
1415
use LogicException;
1516
use PHPUnit\Framework\TestCase;
1617

@@ -19,14 +20,21 @@ class SimpleNormalizableTraitTest extends TestCase
1920
public function testNormalize(): void
2021
{
2122
$dateTime = new DateTimeRfc3339Normalizable();
22-
$normalizable = $this->createAutoNormalizable($dateTime);
23+
$stringable = new Exception('message', 269);
24+
$normalizable = $this->createAutoNormalizable($dateTime, $stringable);
2325
self::assertEquals(
24-
$this->getExpectedNormalized($normalizable, $dateTime, 1),
26+
$this->getExpectedNormalized($normalizable, $dateTime, $stringable, 1),
2527
$normalizable->normalize()
2628
);
2729
}
2830

29-
private function createAutoNormalizable(DateTimeRfc3339Normalizable $dateTimeRfc3339Normalizable): NormalizableInterface
31+
/**
32+
* @param object $stringable
33+
*/
34+
private function createAutoNormalizable(
35+
DateTimeRfc3339Normalizable $dateTimeRfc3339Normalizable,
36+
$stringable
37+
): NormalizableInterface
3038
{
3139
return new class (
3240
1,
@@ -39,7 +47,8 @@ private function createAutoNormalizable(DateTimeRfc3339Normalizable $dateTimeRfc
3947
[1, '1', false, null],
4048
new IntegerObject(5),
4149
new StringObject('10'),
42-
$dateTimeRfc3339Normalizable
50+
$dateTimeRfc3339Normalizable,
51+
$stringable
4352
) implements NormalizableInterface {
4453
use SimpleNormalizableTrait;
4554

@@ -87,8 +96,13 @@ private function createAutoNormalizable(DateTimeRfc3339Normalizable $dateTimeRfc
8796
* @var DateTimeInterface
8897
*/
8998
private $dateTimeRfc3339Normalizable;
99+
/**
100+
* @var object
101+
*/
102+
private $stringable;
90103

91104
/**
105+
* @param object $stringable
92106
* @param array<int, mixed> $privateArray
93107
*/
94108
public function __construct(
@@ -102,7 +116,8 @@ public function __construct(
102116
array $privateArray,
103117
IntegerObject $integerObject,
104118
StringObject $stringObject,
105-
DateTimeInterface $dateTimeRfc3339Normalizable
119+
DateTimeInterface $dateTimeRfc3339Normalizable,
120+
$stringable
106121
)
107122
{
108123
$this->publicInt = $publicInt;
@@ -116,16 +131,20 @@ public function __construct(
116131
$this->integerObject = $integerObject;
117132
$this->stringObject = $stringObject;
118133
$this->dateTimeRfc3339Normalizable = $dateTimeRfc3339Normalizable;
134+
$this->stringable = $stringable;
119135
}
120136
};
121137
}
122138

123139
/**
140+
* @param object $stringable
141+
*
124142
* @return array<string, mixed>
125143
*/
126144
private function getExpectedNormalized(
127145
NormalizableInterface $normalizable,
128146
DateTimeRfc3339Normalizable $dateTime,
147+
$stringable,
129148
int $publicIntManuallyNormalized
130149
): array
131150
{
@@ -142,20 +161,25 @@ private function getExpectedNormalized(
142161
'integerObject' => 5,
143162
'stringObject' => '10',
144163
'dateTimeRfc3339Normalizable' => $dateTime->normalize(),
164+
'stringable' => (string) $stringable,
145165
];
146166
}
147167

148168
public function testAutoNormalize(): void
149169
{
150170
$dateTime = new DateTimeRfc3339Normalizable();
151-
$normalizable = $this->createNormalizable($dateTime);
171+
$stringable = new Exception('message', 269);
172+
$normalizable = $this->createNormalizable($dateTime, $stringable);
152173
self::assertEquals(
153-
$this->getExpectedNormalized($normalizable, $dateTime, 2),
174+
$this->getExpectedNormalized($normalizable, $dateTime, $stringable, 2),
154175
$normalizable->normalize()
155176
);
156177
}
157178

158-
private function createNormalizable(DateTimeRfc3339Normalizable $dateTimeRfc3339Normalizable): NormalizableInterface
179+
/**
180+
* @param object $stringable
181+
*/
182+
private function createNormalizable(DateTimeRfc3339Normalizable $dateTimeRfc3339Normalizable, $stringable): NormalizableInterface
159183
{
160184
return new class (
161185
1,
@@ -168,7 +192,8 @@ private function createNormalizable(DateTimeRfc3339Normalizable $dateTimeRfc3339
168192
[1, '1', false, null],
169193
new IntegerObject(5),
170194
new StringObject('10'),
171-
$dateTimeRfc3339Normalizable
195+
$dateTimeRfc3339Normalizable,
196+
$stringable
172197
) implements NormalizableInterface {
173198
use SimpleNormalizableTrait;
174199

@@ -216,6 +241,10 @@ private function createNormalizable(DateTimeRfc3339Normalizable $dateTimeRfc3339
216241
* @var DateTimeInterface
217242
*/
218243
private $dateTimeRfc3339Normalizable;
244+
/**
245+
* @var object
246+
*/
247+
private $stringable;
219248

220249
/**
221250
* @param array<int, mixed> $privateArray
@@ -231,7 +260,8 @@ public function __construct(
231260
array $privateArray,
232261
IntegerObject $integerObject,
233262
StringObject $stringObject,
234-
DateTimeInterface $dateTimeRfc3339Normalizable
263+
DateTimeInterface $dateTimeRfc3339Normalizable,
264+
$stringable
235265
)
236266
{
237267
$this->publicInt = $publicInt;
@@ -245,6 +275,7 @@ public function __construct(
245275
$this->integerObject = $integerObject;
246276
$this->stringObject = $stringObject;
247277
$this->dateTimeRfc3339Normalizable = $dateTimeRfc3339Normalizable;
278+
$this->stringable = $stringable;
248279
}
249280

250281
/**

0 commit comments

Comments
 (0)