8000 [FrameworkBundle] Object Mapper component bindings · symfony/symfony@4cc4edd · GitHub
[go: up one dir, main page]

Skip to content

Commit 4cc4edd

Browse files
committed
[FrameworkBundle] Object Mapper component bindings
1 parent ee21586 commit 4cc4edd

File tree

9 files changed

+167
-1
lines changed

9 files changed

+167
-1
lines changed

src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,9 @@
125125
use Symfony\Component\Notifier\Recipient\Recipient;
126126
use Symfony\Component\Notifier\TexterInterface;
127127
use Symfony\Component\Notifier\Transport\TransportFactoryInterface as NotifierTransportFactoryInterface;
128+
use Symfony\Component\ObjectMapper\ConditionCallableInterface;
129+
use Symfony\Component\ObjectMapper\ObjectMapperInterface;
130+
use Symfony\Component\ObjectMapper\TransformCallableInterface;
128131
use Symfony\Component\Process\Messenger\RunProcessMessageHandler;
129132
use Symfony\Component\PropertyAccess\PropertyAccessor;
130133
use Symfony\Component\PropertyInfo\Extractor\PhpDocExtractor;
@@ -778,6 +781,14 @@ private function registerFormConfiguration(array $config, ContainerBuilder $cont
778781
if (!ContainerBuilder::willBeAvailable('symfony/translation', Translator::class, ['symfony/framework-bundle', 'symfony/form'])) {
779782
$container->removeDefinition('form.type_extension.upload.validator');
780783
}
784+
785+
if (interface_exists(ObjectMapperInterface::class)) {
786+
$loader->load('object_mapper.php');
787+
$container->registerForAutoconfiguration(TransformCallableInterface::class)
788+
->addTag('object_mapper.transform_callable');
789+
$container->registerForAutoconfiguration(ConditionCallableInterface::class)
790+
->addTag('object_mapper.condition_callable');
791+
}
781792
}
782793

783794
private function registerHttpCacheConfiguration(array $config, ContainerBuilder $container, bool $httpMethodOverride): void
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
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\DependencyInjection\Loader\Configurator;
13+
14+
use Symfony\Component\ObjectMapper\Metadata\ObjectMapperMetadataFactoryInterface;
15+
use Symfony\Component\ObjectMapper\Metadata\ReflectionObjectMapperMetadataFactory;
16+
use Symfony\Component\ObjectMapper\ObjectMapper;
17+
use Symfony\Component\ObjectMapper\ObjectMapperInterface;
18+
19+
return static function (ContainerConfigurator $container) {
20+
$container->services()
21+
->set('object_mapper.metadata_factory', ReflectionObjectMapperMetadataFactory::class)
22+
->alias(ReflectionObjectMapperMetadataFactory::class, 'object_mapper.metadata_factory')
23+
->alias(ObjectMapperMetadataFactoryInterface::class, 'object_mapper.metadata_factory')
24+
25+
->set('object_mapper', ObjectMapper::class)
26+
->args([
27+
service('object_mapper.metadata_factory')->ignoreOnInvalid(),
28+
service('property_accessor')->ignoreOnInvalid(),
29+
tagged_locator('object_mapper.transform_callable'),
30+
tagged_locator('object_mapper.condition_callable'),
31+
])
32+
->alias(ObjectMapper::class, 'object_mapper')
33+
->alias(ObjectMapperInterface::class, 'object_mapper')
34+
;
35+
};
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
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\Bundle\FrameworkBundle\Tests\Fixtures\ObjectMapper;
13+
14+
final class ObjectMapped
15+
{
16+
public string $a;
17+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
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\Bundle\FrameworkBundle\Tests\Fixtures\ObjectMapper;
13+
14+
use Symfony\Component\ObjectMapper\Attribute\Map;
15+
16+
#[Map(target: ObjectMapped::class)]
17+
final class ObjectToBeMapped
18+
{
19+
#[Map(transform: TransformCallable::class)]
20+
public string $a = 'nottransformed';
21+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
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\Bundle\FrameworkBundle\Tests\Fixtures\ObjectMapper;
13+
14+
use Symfony\Component\ObjectMapper\TransformCallableInterface;
15+
16+
/**
17+
* @implements TransformCallableInterface<ObjectToBeMapped>
18+
*/
19+
final class TransformCallable implements TransformCallableInterface
20+
{
21+
public function __invoke(mixed $value, object $object): mixed
22+
{
23+
return 'transformed';
24+
}
25+
}
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\Bundle\FrameworkBundle\Tests\Functional;
13+
14+
use Symfony\Bundle\FrameworkBundle\Tests\Fixtures\ObjectMapper\ObjectMapped;
15+
use Symfony\Bundle\FrameworkBundle\Tests\Fixtures\ObjectMapper\ObjectToBeMapped;
16+
17+
/**
18+
* @author Kévin Dunglas <dunglas@gmail.com>
19+
*/
20+
class ObjectMapperTest extends AbstractWebTestCase
21+
{
22+
public function testObjectMapper(): void
23+
{
24+
static::bootKernel(['test_case' => 'ObjectMapper']);
25+
26+
/** @var Symfony\Component\ObjectMapper\ObjectMapperInterface<ObjectMapped> */
27+
$objectMapper = static::getContainer()->get('object_mapper.alias');
28+
$mapped = $objectMapper->map(new ObjectToBeMapped());
29+
$this->assertSame($mapped->a, 'transformed');
30+
}
31+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
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+
use Symfony\Bundle\FrameworkBundle\FrameworkBundle;
13+
14+
return [
15+
new FrameworkBundle(),
16+
];
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
imports:
2+
- { resource: ../config/default.yml }
3+
4+
services:
5+
object_mapper.alias:
6+
alias: object_mapper
7+
public: true
8+
Symfony\Bundle\FrameworkBundle\Tests\Fixtures\ObjectMapper\TransformCallable:
9+
autoconfigure: true

src/Symfony/Bundle/FrameworkBundle/composer.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,8 @@
5959
"symfony/scheduler": "^6.4.4|^7.0.4",
6060
"symfony/security-bundle": "^6.4|^7.0",
6161
"symfony/semaphore": "^6.4|^7.0",
62-
"symfony/serializer": "^7.1",
62+
"symfony/serializer": "^6.4|^7.0",
63+
"symfony/object-mapper": "^7.3",
6364
"symfony/stopwatch": "^6.4|^7.0",
6465
"symfony/string": "^6.4|^7.0",
6566
"symfony/translation": "^6.4|^7.0",

0 commit comments

Comments
 (0)
0