Skip to content

Commit 4dcc3b4

Browse files
committed
Merge branch '4.4' into main
2 parents c4a00be + 8f00505 commit 4dcc3b4

12 files changed

+290
-68
lines changed

src/bundle/Resources/config/services.yml

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,16 @@ parameters:
88
- '(^.*/.*$)'
99

1010
services:
11+
Ibexa\Bundle\Rest\Serializer\SerializerFactory:
12+
arguments:
13+
- !tagged_iterator 'ibexa.rest.serializer.normalizer'
14+
- !tagged_iterator 'ibexa.rest.serializer.encoder'
15+
16+
ibexa.rest.serializer:
17+
class: Symfony\Component\Serializer\Serializer
18+
autoconfigure: false
19+
factory: [ '@Ibexa\Bundle\Rest\Serializer\SerializerFactory', 'create' ]
20+
1121
Ibexa\Bundle\Rest\Routing\OptionsLoader:
1222
arguments:
1323
- '@Ibexa\Bundle\Rest\Routing\OptionsLoader\RouteCollectionMapper'
@@ -308,15 +318,25 @@ services:
308318
calls:
309319
- [ setFormatOutput, [ "%kernel.debug%" ] ]
310320

311-
Ibexa\Rest\Output\Generator\Xml\FieldTypeHashGenerator: ~
321+
Ibexa\Rest\Output\Generator\Xml\FieldTypeHashGenerator:
322+
arguments:
323+
$normalizer: '@ibexa.rest.serializer'
324+
$logger: '@logger'
325+
tags:
326+
- { name: monolog.logger, channel: ibexa.rest }
312327

313328
Ibexa\Rest\Output\Generator\Json:
314329
arguments:
315330
- '@Ibexa\Rest\Output\Generator\Json\FieldTypeHashGenerator'
316331
calls:
317332
- [ setFormatOutput, [ "%kernel.debug%" ] ]
318333

319-
Ibexa\Rest\Output\Generator\Json\FieldTypeHashGenerator: ~
334+
Ibexa\Rest\Output\Generator\Json\FieldTypeHashGenerator:
335+
arguments:
336+
$normalizer: '@ibexa.rest.serializer'
337+
$logger: '@logger'
338+
tags:
339+
- { name: monolog.logger, channel: ibexa.rest }
320340

321341
# value objects visitors
322342
Ibexa\Contracts\Rest\Output\ValueObjectVisitorDispatcher: ~
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
<?php
2+
3+
/**
4+
* @copyright Copyright (C) Ibexa AS. All rights reserved.
5+
* @license For full copyright and license information view LICENSE file distributed with this source code.
6+
*/
7+
declare(strict_types=1);
8+
9+
namespace Ibexa\Bundle\Rest\Serializer;
10+
11+
use Symfony\Component\Serializer\Serializer;
12+
use Traversable;
13+
14+
final class SerializerFactory
15+
{
16+
/**
17+
* @var iterable<\Symfony\Component\Serializer\Normalizer\NormalizerInterface|\Symfony\Component\Serializer\Normalizer\DenormalizerInterface>
18+
*/
19+
private iterable $normalizers;
20+
21+
/**
22+
* @var iterable<\Symfony\Component\Serializer\Encoder\EncoderInterface|\Symfony\Component\Serializer\Encoder\DecoderInterface>
23+
*/
24+
private iterable $encoders;
25+
26+
/**
27+
* @param iterable<\Symfony\Component\Serializer\Normalizer\NormalizerInterface|\Symfony\Component\Serializer\Normalizer\DenormalizerInterface> $normalizers
28+
* @param iterable<\Symfony\Component\Serializer\Encoder\EncoderInterface|\Symfony\Component\Serializer\Encoder\DecoderInterface> $encoders
29+
*/
30+
public function __construct(iterable $normalizers, iterable $encoders)
31+
{
32+
$this->normalizers = $normalizers;
33+
$this->encoders = $encoders;
34+
}
35+
36+
public function create(): Serializer
37+
{
38+
$normalizers = $this->normalizers;
39+
if ($normalizers instanceof Traversable) {
40+
$normalizers = iterator_to_array($normalizers);
41+
}
42+
43+
$encoders = $this->encoders;
44+
if ($encoders instanceof Traversable) {
45+
$encoders = iterator_to_array($encoders);
46+
}
47+
48+
return new Serializer($normalizers, $encoders);
49+
}
50+
}

src/lib/Output/Generator/Json/FieldTypeHashGenerator.php

Lines changed: 60 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,27 @@
66
*/
77
namespace Ibexa\Rest\Output\Generator\Json;
88

9-
class FieldTypeHashGenerator
9+
use Psr\Log\LoggerAwareInterface;
10+
use Psr\Log\LoggerAwareTrait;
11+
use Psr\Log\LoggerInterface;
12+
use Psr\Log\NullLogger;
13+
use Symfony\Component\Serializer\Exception\ExceptionInterface;
14+
use Symfony\Component\Serializer\Normalizer\NormalizerInterface;
15+
16+
class FieldTypeHashGenerator implements LoggerAwareInterface
1017
{
18+
use LoggerAwareTrait;
19+
20+
private NormalizerInterface $normalizer;
21+
22+
public function __construct(
23+
NormalizerInterface $normalizer,
24+
?LoggerInterface $logger = null
25+
) {
26+
$this->normalizer = $normalizer;
27+
$this->logger = $logger ?? new NullLogger();
28+
}
29+
1130
/**
1231
* Generates the field type value $hashValue as a child of the given Object
1332
* using $hashElementName as the property name.
@@ -32,24 +51,20 @@ public function generateHashValue($parent, $hashElementName, $hashValue)
3251
*/
3352
protected function generateValue($parent, $value)
3453
{
35-
switch (($hashValueType = gettype($value))) {
36-
case 'NULL':
37-
case 'boolean':
38-
case 'integer':
39-
case 'double':
40-
case 'string':
41-
42-
// Will be handled accordingly on serialization
43-
return $value;
44-
break;
45-
46-
case 'array':
47-
return $this->generateArrayValue($parent, $value);
48-
break;
49-
50-
default:
51-
throw new \Exception('Invalid type in Field value hash: ' . $hashValueType);
54+
if ($value === null || is_scalar($value)) {
55+
// Will be handled accordingly on serialization
56+
return $value;
5257
}
58+
59+
if (is_array($value)) {
60+
return $this->generateArrayValue($parent, $value);
61+
}
62+
63+
if (is_object($value)) {
64+
return $this->generateObjectValue($parent, $value);
65+
}
66+
67+
throw new \Exception('Invalid type in Field value hash: ' . get_debug_type($value));
5368
}
5469

5570
/**
@@ -126,6 +141,33 @@ protected function isNumericArray(array $value)
126141

127142
return true;
128143
}
144+
145+
/**
146+
* @param \Ibexa\Rest\Output\Generator\Json\ArrayObject|\Ibexa\Rest\Output\Generator\Json\JsonObject $parent
147+
*
148+
* @return mixed
149+
*/
150+
private function generateObjectValue($parent, object $value)
151+
{
152+
try {
153+
$value = $this->normalizer->normalize($value, 'json', ['parent' => $parent]);
154+
} catch (ExceptionInterface $e) {
155+
$message = sprintf(
156+
'Unable to normalize value for type "%s". %s. '
157+
. 'Ensure that a normalizer is registered with tag: "%s".',
158+
get_class($value),
159+
$e->getMessage(),
160+
'ibexa.rest.serializer.normalizer',
161+
);
162+
$this->logger->error($message, [
163+
'exception' => $e,
164+
]);
165+
166+
$value = null;
167+
}
168+
169+
return $this->generateValue($parent, $value);
170+
}
129171
}
130172

131173
class_alias(FieldTypeHashGenerator::class, 'EzSystems\EzPlatformRest\Output\Generator\Json\FieldTypeHashGenerator');

src/lib/Output/Generator/Xml/FieldTypeHashGenerator.php

Lines changed: 56 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,27 @@
66
*/
77
namespace Ibexa\Rest\Output\Generator\Xml;
88

9-
class FieldTypeHashGenerator
9+
use Psr\Log\LoggerAwareInterface;
10+
use Psr\Log\LoggerAwareTrait;
11+
use Psr\Log\LoggerInterface;
12+
use Psr\Log\NullLogger;
13+
use Symfony\Component\Serializer\Exception\ExceptionInterface;
14+
use Symfony\Component\Serializer\Normalizer\NormalizerInterface;
15+
16+
class FieldTypeHashGenerator implements LoggerAwareInterface
1017
{
18+
use LoggerAwareTrait;
19+
20+
private NormalizerInterface $normalizer;
21+
22+
public function __construct(
23+
NormalizerInterface $normalizer,
24+
?LoggerInterface $logger = null
25+
) {
26+
$this->normalizer = $normalizer;
27+
$this->logger = $logger ?? new NullLogger();
28+
}
29+
1130
/**
1231
* Generates the field type value $hashValue into the $writer creating an
1332
* element with $hashElementName as its parent.
@@ -31,33 +50,22 @@ public function generateHashValue(\XMLWriter $writer, $hashElementName, $hashVal
3150
*/
3251
protected function generateValue(\XmlWriter $writer, $value, $key = null, $elementName = 'value')
3352
{
34-
switch (($hashValueType = gettype($value))) {
35-
case 'NULL':
36-
$this->generateNullValue($writer, $key, $elementName);
37-
break;
38-
39-
case 'boolean':
40-
$this->generateBooleanValue($writer, $value, $key, $elementName);
41-
break;
42-
43-
case 'integer':
44-
$this->generateIntegerValue($writer, $value, $key, $elementName);
45-
break;
46-
47-
case 'double':
48-
$this->generateFloatValue($writer, $value, $key, $elementName);
49-
break;
50-
51-
case 'string':
52-
$this->generateStringValue($writer, $value, $key, $elementName);
53-
break;
54-
55-
case 'array':
56-
$this->generateArrayValue($writer, $value, $key, $elementName);
57-
break;
58-
59-
default:
60-
throw new \Exception('Invalid type in Field value hash: ' . $hashValueType);
53+
if ($value === null) {
54+
$this->generateNullValue($writer, $key, $elementName);
55+
} elseif (is_bool($value)) {
56+
$this->generateBooleanValue($writer, $value, $key, $elementName);
57+
} elseif (is_int($value)) {
58+
$this->generateIntegerValue($writer, $value, $key, $elementName);
59+
} elseif (is_float($value)) {
60+
$this->generateFloatValue($writer, $value, $key, $elementName);
61+
} elseif (is_string($value)) {
62+
$this->generateStringValue($writer, $value, $key, $elementName);
63+
} elseif (is_array($value)) {
64+
$this->generateArrayValue($writer, $value, $key, $elementName);
65+
} elseif (is_object($value)) {
66+
$this->generateObjectValue($value, $writer, $key, $elementName);
67+
} else {
68+
throw new \Exception('Invalid type in Field value hash: ' . get_debug_type($value));
6169
}
6270
}
6371

@@ -229,6 +237,26 @@ protected function generateKeyAttribute(\XmlWriter $writer, $key = null)
229237
$writer->endAttribute();
230238
}
231239
}
240+
241+
private function generateObjectValue(object $value, \XmlWriter $writer, ?string $key, string $elementName): void
242+
{
243+
try {
244+
$value = $this->normalizer->normalize($value, 'xml');
245+
} catch (ExceptionInterface $e) {
246+
$message = sprintf(
247+
'Unable to normalize value for type "%s". %s. '
248+
. 'Ensure that a normalizer is registered with tag: "%s".',
249+
get_class($value),
250+
$e->getMessage(),
251+
'ibexa.rest.serializer.normalizer',
252+
);
253+
$this->logger->error($message, [
254+
'exception' => $e,
255+
]);
256+
$value = null;
257+
}
258+
$this->generateValue($writer, $value, $key, $elementName);
259+
}
232260
}
233261

234262
class_alias(FieldTypeHashGenerator::class, 'EzSystems\EzPlatformRest\Output\Generator\Xml\FieldTypeHashGenerator');

0 commit comments

Comments
 (0)