Skip to content

Commit ea26eba

Browse files
committed
[Serializer] Add context option to configure the indentation of nested nodes for YamlEncoder
1 parent c1f53b5 commit ea26eba

File tree

3 files changed

+28
-2
lines changed

3 files changed

+28
-2
lines changed

src/Symfony/Component/Serializer/CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ CHANGELOG
1010
* Deprecate calling `AttributeMetadata::setSerializedName()`, `ClassMetadata::setClassDiscriminatorMapping()` without arguments
1111
* Change the signature of `AttributeMetadataInterface::setSerializedName()` to `setSerializedName(?string)`
1212
* Change the signature of `ClassMetadataInterface::setClassDiscriminatorMapping()` to `setClassDiscriminatorMapping(?ClassDiscriminatorMapping)`
13+
* Add option YamlEncoder::YAML_INDENTATION to YamlEncoder constructor options to configure additional indentation for each level of nesting. This allows configuring indentation in the service configuration.
1314

1415
6.1
1516
---

src/Symfony/Component/Serializer/Encoder/YamlEncoder.php

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,17 @@ class YamlEncoder implements EncoderInterface, DecoderInterface
2828

2929
public const PRESERVE_EMPTY_OBJECTS = 'preserve_empty_objects';
3030

31+
/**
32+
* Override the amount of spaces to use for indentation of nested nodes.
33+
*
34+
* This option only works in the constructor, not in calls to `encode`.
35+
*/
36+
public const YAML_INDENTATION = 'yaml_indentation';
37+
3138
public const YAML_INLINE = 'yaml_inline';
39+
/**
40+
* Initial indentation for root element.
41+
*/
3242
public const YAML_INDENT = 'yaml_indent';
3343
public const YAML_FLAGS = 'yaml_flags';
3444

@@ -46,8 +56,12 @@ public function __construct(Dumper $dumper = null, Parser $parser = null, array
4656
throw new RuntimeException('The YamlEncoder class requires the "Yaml" component. Install "symfony/yaml" to use it.');
4757
}
4858

49-
$this->dumper = $dumper ?? new Dumper();
59+
if (!$dumper) {
60+
$dumper = \array_key_exists(self::YAML_INDENTATION, $defaultContext) ? new Dumper($defaultContext[self::YAML_INDENTATION]) : new Dumper();
61+
}
62+
$this->dumper = $dumper;
5063
$this->parser = $parser ?? new Parser();
64+
unset($defaultContext[self::YAML_INDENTATION]);
5165
$this->defaultContext = array_merge($this->defaultContext, $defaultContext);
5266
}
5367

src/Symfony/Component/Serializer/Tests/Encoder/YamlEncoderTest.php

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,9 +58,20 @@ public function testSupportsDecoding()
5858
$this->assertFalse($encoder->supportsDecoding('json'));
5959
}
6060

61+
public function testIndentation()
62+
{
63+
$encoder = new YamlEncoder(null, null, [YamlEncoder::YAML_INLINE => 100, YamlEncoder::YAML_INDENTATION => 7]);
64+
65+
$expected = <<<'END'
66+
foo:
67+
bar: baz
68+
END;
69+
$this->assertSame($expected."\n", $encoder->encode(['foo' => ['bar' => 'baz']], 'yaml'));
70+
}
71+
6172
public function testContext()
6273
{
63-
$encoder = new YamlEncoder(new Dumper(), new Parser(), [YamlEncoder::YAML_INLINE => 1, YamlEncoder::YAML_INDENT => 4, YamlEncoder::YAML_FLAGS => Yaml::DUMP_OBJECT | Yaml::PARSE_OBJECT]);
74+
$encoder = new YamlEncoder(null, null, [YamlEncoder::YAML_INLINE => 1, YamlEncoder::YAML_INDENT => 4, YamlEncoder::YAML_FLAGS => Yaml::DUMP_OBJECT | Yaml::PARSE_OBJECT]);
6475

6576
$obj = new \stdClass();
6677
$obj->bar = 2;

0 commit comments

Comments
 (0)