8000 minor #46179 [Serializer] Fine-tune `ContextBuilder::withContext()` (… · symfony/symfony@7a21a57 · GitHub
[go: up one dir, main page]

Skip to content

Commit 7a21a57

Browse files
minor #46179 [Serializer] Fine-tune ContextBuilder::withContext() (chalasr)
This PR was merged into the 6.1 branch. Discussion ---------- [Serializer] Fine-tune `ContextBuilder::withContext()` | Q | A | ------------- | --- | Branch? | 6.1 | Bug fix? | no | New feature? | yes, small DX improvement | Deprecations? | no | Tickets | - | License | MIT | Doc PR | todo Allows to skip calling `toArray()` on the context builder when it is passed to `withContext()`: ```php $contextBuilder = (new CsvEncoderContextBuilder()) ->withContext($contextBuilder) ->withDelimiter('-') ``` instead of ```php $contextBuilder = (new CsvEncoderContextBuilder()) ->withContext($contextBuilder->toArray()) ->withDelimiter('-') ``` Allowing to do the same when passing the context to `serialize()` would require to revisit the SerializerInterface, which we can consider for 6.2. /cc `@mtarld` Commits ------- b4e2023 [Serializer] Fine-tune `ContextBuilder::withContext()`
2 parents 134a5f1 + b4e2023 commit 7a21a57

16 files changed

+68
-16
lines changed
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
<?php
2+
3+
/*
4+
* This file is part of the Symfony package.
5+
*
6+
* (c) Fabien Potencier <fabien@symfony.com>
7+
*
8+
* For the full copyright and license information, please view the LICENSE
9+
* file that was distributed with this source code.
10+
*/
11+
12+
namespace Symfony\Component\Serializer\Context;
13+
14+
/**
15+
* Common interface for context builders.
16+
*
17+
* @author Mathias Arlaud <mathias.arlaud@gmail.com>
18+
* @author Robin Chalas <robin.chalas@gmail.com>
19+
*/
20+
interface ContextBuilderInterface
21+
{
22+
/**
23+
* @param self|array<string, mixed> $context
24+
*/
25+
public function withContext(self|array $context): static;
26+
27+
/**
28+
* @return array<string, mixed>
29+
*/
30+
public function toArray(): array;
31+
}

src/Symfony/Component/Serializer/Context/ContextBuilderTrait.php

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,10 +30,14 @@ protected function with(string $key, mixed $value): static
3030
}
3131

3232
/**
33-
* @param array<string, mixed> $context
33+
* @param ContextBuilderInterface|array<string, mixed> $context
3434
*/
35-
public function withContext(array $context): static
35+
public function withContext(ContextBuilderInterface|array $context): static
3636
{
37+
if ($context instanceof ContextBuilderInterface) {
38+
$context = $context->toArray();
39+
}
40+
3741
$instance = new static();
3842
$instance->context = array_merge($this->context, $context);
3943

src/Symfony/Component/Serializer/Context/Encoder/CsvEncoderContextBuilder.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111

1212
namespace Symfony\Component\Serializer\Context\Encoder;
1313

14+
use Symfony\Component\Serializer\Context\ContextBuilderInterface;
1415
use Symfony\Component\Serializer\Context\ContextBuilderTrait;
1516
use Symfony\Component\Serializer\Encoder\CsvEncoder;
1617
use Symfony\Component\Serializer\Exception\InvalidArgumentException;
@@ -20,7 +21,7 @@
2021
*
2122
* @author Mathias Arlaud <mathias.arlaud@gmail.com>
2223
*/
23-
final class CsvEncoderContextBuilder
24+
final class CsvEncoderContextBuilder implements ContextBuilderInterface
2425
{
2526
use ContextBuilderTrait;
2627

src/Symfony/Component/Serializer/Context/Encoder/JsonEncoderContextBuilder.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111

1212
namespace Symfony\Component\Serializer\Context\Encoder;
1313

14+
use Symfony\Component\Serializer\Context\ContextBuilderInterface;
1415
use Symfony\Component\Serializer\Context\ContextBuilderTrait;
1516
use Symfony\Component\Serializer\Encoder\JsonDecode;
1617
use Symfony\Component\Serializer\Encoder\JsonEncode;
@@ -20,7 +21,7 @@
2021
*
2122
* @author Mathias Arlaud <mathias.arlaud@gmail.com>
2223
*/
23-
final class JsonEncoderContextBuilder
24+
final class JsonEncoderContextBuilder implements ContextBuilderInterface
2425
{
2526
use ContextBuilderTrait;
2627

src/Symfony/Component/Serializer/Context/Encoder/XmlEncoderContextBuilder.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111

1212
namespace Symfony\Component\Serializer\Context\Encoder;
1313

14+
use Symfony\Component\Serializer\Context\ContextBuilderInterface;
1415
use Symfony\Component\Serializer\Context\ContextBuilderTrait;
1516
use Symfony\Component\Serializer\Encoder\XmlEncoder;
1617

@@ -19,7 +20,7 @@
1920
*
2021
* @author Mathias Arlaud <mathias.arlaud@gmail.com>
2122
*/
22-
final class XmlEncoderContextBuilder
23+
final class XmlEncoderContextBuilder implements ContextBuilderInterface
2324
{
2425
use ContextBuilderTrait;
2526

src/Symfony/Component/Serializer/Context/Encoder/YamlEncoderContextBuilder.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111

1212
namespace Symfony\Component\Serializer\Context\Encoder;
1313

14+
use Symfony\Component\Serializer\Context\ContextBuilderInterface;
1415
use Symfony\Component\Serializer\Context\ContextBuilderTrait;
1516
use Symfony\Component\Serializer\Encoder\YamlEncoder;
1617

@@ -19,7 +20,7 @@
1920
*
2021
* @author Mathias Arlaud <mathias.arlaud@gmail.com>
2122
*/
22-
final class YamlEncoderContextBuilder
23+
final class YamlEncoderContextBuilder implements ContextBuilderInterface
2324
{
2425
use ContextBuilderTrait;
2526

src/Symfony/Component/Serializer/Context/Normalizer/AbstractNormalizerContextBuilder.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111

1212
namespace Symfony\Component\Serializer\Context\Normalizer;
1313

14+
use Symfony\Component\Serializer\Context\ContextBuilderInterface;
1415
use Symfony\Component\Serializer\Context\ContextBuilderTrait;
1516
use Symfony\Component\Serializer\Exception\InvalidArgumentException;
1617
use Symfony\Component\Serializer\Normalizer\AbstractNormalizer;
@@ -20,7 +21,7 @@
2021
*
2122
* @author Mathias Arlaud <mathias.arlaud@gmail.com>
2223
*/
23-
abstract class AbstractNormalizerContextBuilder
24+
abstract class AbstractNormalizerContextBuilder implements ContextBuilderInterface
2425
{
2526
use ContextBuilderTrait;
2627

src/Symfony/Component/Serializer/Context/Normalizer/ConstraintViolationListNormalizerContextBuilder.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111

1212
namespace Symfony\Component\Serializer\Context\Normalizer;
1313

14+
use Symfony\Component\Serializer\Context\ContextBuilderInterface;
1415
use Symfony\Component\Serializer\Context\ContextBuilderTrait;
1516
use Symfony\Component\Serializer\Normalizer\ConstraintViolationListNormalizer;
1617

@@ -19,7 +20,7 @@
1920
*
2021
* @author Mathias Arlaud <mathias.arlaud@gmail.com>
2122
*/
22-
final class ConstraintViolationListNormalizerContextBuilder
23+
final class ConstraintViolationListNormalizerContextBuilder implements ContextBuilderInterface
2324
{
2425
use ContextBuilderTrait;
2526

src/Symfony/Component/Serializer/Context/Normalizer/DateIntervalNormalizerContextBuilder.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111

1212
namespace Symfony\Component\Serializer\Context\Normalizer;
1313

14+
use Symfony\Component\Serializer\Context\ContextBuilderInterface;
1415
use Symfony\Component\Serializer\Context\ContextBuilderTrait;
1516
use Symfony\Component\Serializer\Normalizer\DateIntervalNormalizer;
1617

@@ -19,7 +20,7 @@
1920
*
2021
* @author Mathias Arlaud <mathias.arlaud@gmail.com>
2122
*/
22-
final class DateIntervalNormalizerContextBuilder
23+
final class DateIntervalNormalizerContextBuilder implements ContextBuilderInterface
2324
{
2425
use ContextBuilderTrait;
2526

src/Symfony/Component/Serializer/Context/Normalizer/DateTimeNormalizerContextBuilder.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111

1212
namespace Symfony\Component\Serializer\Context\Normalizer;
1313

14+
use Symfony\Component\Serializer\Context\ContextBuilderInterface;
1415
use Symfony\Component\Serializer\Context\ContextBuilderTrait;
1516
use Symfony\Component\Serializer\Exception\InvalidArgumentException;
1617
use Symfony\Component\Serializer\Normalizer\DateTimeNormalizer;
@@ -20,7 +21,7 @@
2021
*
2122
* @author Mathias Arlaud <mathias.arlaud@gmail.com>
2223
*/
23-
final class DateTimeNormalizerContextBuilder
24+
final class DateTimeNormalizerContextBuilder implements ContextBuilderInterface
2425
{
2526
use ContextBuilderTrait;
2627

src/Symfony/Component/Serializer/Context/Normalizer/FormErrorNormalizerContextBuilder.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111

1212
namespace Symfony\Component\Serializer\Context\Normalizer;
1313

14+
use Symfony\Component\Serializer\Context\ContextBuilderInterface;
1415
use Symfony\Component\Serializer\Context\ContextBuilderTrait;
1516
use Symfony\Component\Serializer\Normalizer\FormErrorNormalizer;
1617

@@ -19,7 +20,7 @@
1920
*
2021
* @author Mathias Arlaud <mathias.arlaud@gmail.com>
2122
*/
22-
final class FormErrorNormalizerContextBuilder
23+
final class FormErrorNormalizerContextBuilder implements ContextBuilderInterface
2324
{
2425
use ContextBuilderTrait;
2526

src/Symfony/Component/Serializer/Context/Normalizer/ProblemNormalizerContextBuilder.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111

1212
namespace Symfony\Component\Serializer\Context\Normalizer;
1313

14+
use Symfony\Component\Serializer\Context\ContextBuilderInterface;
1415
use Symfony\Component\Serializer\Context\ContextBuilderTrait;
1516
use Symfony\Component\Serializer\Normalizer\ProblemNormalizer;
1617

@@ -19,7 +20,7 @@
1920
*
2021
* @author Mathias Arlaud <mathias.arlaud@gmail.com>
2122
*/
22-
final class ProblemNormalizerContextBuilder
23+
final class ProblemNormalizerContextBuilder implements ContextBuilderInterface
2324
{
2425
use ContextBuilderTrait;
2526

src/Symfony/Component/Serializer/Context/Normalizer/UidNormalizerContextBuilder.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111

1212
namespace Symfony\Component\Serializer\Context\Normalizer;
1313

14+
use Symfony\Component\Serializer\Context\ContextBuilderInterface;
1415
use Symfony\Component\Serializer\Context\ContextBuilderTrait;
1516
use Symfony\Component\Serializer\Exception\InvalidArgumentException;
1617
use Symfony\Component\Serializer\Normalizer\UidNormalizer;
@@ -20,7 +21,7 @@
2021
*
2122
* @author Mathias Arlaud <mathias.arlaud@gmail.com>
2223
*/
23-
final class UidNormalizerContextBuilder
24+
final class UidNormalizerContextBuilder implements ContextBuilderInterface
2425
{
2526
use ContextBuilderTrait;
2627

src/Symfony/Component/Serializer/Context/Normalizer/UnwrappingDenormalizerContextBuilder.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313

1414
use Symfony\Component\PropertyAccess\Exception\InvalidPropertyPathException;
1515
use Symfony\Component\PropertyAccess\PropertyPath;
16+
use Symfony\Component\Serializer\Context\ContextBuilderInterface;
1617
use Symfony\Component\Serializer\Context\ContextBuilderTrait;
1718
use Symfony\Component\Serializer\Exception\InvalidArgumentException;
1819
use Symfony\Component\Serializer\Normalizer\UnwrappingDenormalizer;
@@ -22,7 +23,7 @@
2223
*
2324
* @author Mathias Arlaud <mathias.arlaud@gmail.com>
2425
*/
25-
final class UnwrappingDenormalizerContextBuilder
26+
final class UnwrappingDenormalizerContextBuilder implements ContextBuilderInterface
2627
{
2728
use ContextBuilderTrait;
2829

src/Symfony/Component/Serializer/Context/SerializerContextBuilder.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
*
2020
* @author Mathias Arlaud <mathias.arlaud@gmail.com>
2121
*/
22-
final class SerializerContextBuilder
22+
final class SerializerContextBuilder implements ContextBuilderInterface
2323
{
2424
use ContextBuilderTrait;
2525

src/Symfony/Component/Serializer/Tests/Context/ContextBuilderTraitTest.php

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
namespace Symfony\Component\Serializer\Tests\Context;
1313

1414
use PHPUnit\Framework\TestCase;
15+
use Symfony\Component\Serializer\Context\ContextBuilderInterface;
1516
use Symfony\Component\Serializer\Context\ContextBuilderTrait;
1617

1718
/**
@@ -21,13 +22,17 @@ class ContextBuilderTraitTest extends TestCase
2122
{
2223
public function testWithContext()
2324
{
24-
$contextBuilder = new class() {
25+
$contextBuilder = new class() implements ContextBuilderInterface {
2526
use ContextBuilderTrait;
2627
};
2728

2829
$context = $contextBuilder->withContext(['foo' => 'bar'])->toArray();
2930

3031
$this->assertSame(['foo' => 'bar'], $context);
32+
33+
$withContextBuilderObject = $contextBuilder->withContext($contextBuilder->withContext(['foo' => 'bar']))->toArray();
34+
35+
$this->assertSame(['foo' => 'bar'], $withContextBuilderObject);
3136
}
3237

3338
public function testWith()

0 commit comments

Comments
 (0)
0