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

Skip to content

Commit 133d2b0

Browse files
committed
[FrameworkBundle] Object Mapper component bindings
1 parent 21b4dd7 commit 133d2b0

File tree

10 files changed

+166
-0
lines changed

10 files changed

+166
-0
lines changed

src/Symfony/Bundle/FrameworkBundle/DependencyInjection/Compiler/UnusedTagsPass.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,8 @@ class UnusedTagsPass implements CompilerPassInterface
106106
'validator.group_provider',
107107
'validator.initializer',
108108
'workflow',
109+
'object_mapper.transform_callable',
110+
'object_mapper.condition_callable',
109111
];
110112

111113
public function process(ContainerBuilder $container): void

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

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,9 @@
144144
use Symfony\Component\Notifier\Recipient\Recipient;
145145
use Symfony\Component\Notifier\TexterInterface;
146146
use Symfony\Component\Notifier\Transport\TransportFactoryInterface as NotifierTransportFactoryInterface;
147+
use Symfony\Component\ObjectMapper\ConditionCallableInterface;
148+
use Symfony\Component\ObjectMapper\ObjectMapperInterface;
149+
use Symfony\Component\ObjectMapper\TransformCallableInterface;
147150
use Symfony\Component\Process\Messenger\RunProcessMessageHandler;
148151
use Symfony\Component\PropertyAccess\PropertyAccessor;
149152
use Symfony\Component\PropertyInfo\Extractor\ConstructorArgumentTypeExtractorInterface;
@@ -863,6 +866,14 @@ private function registerFormConfiguration(array $config, ContainerBuilder $cont
863866
if (!ContainerBuilder::willBeAvailable('symfony/translation', Translator::class, ['symfony/framework-bundle', 'symfony/form'])) {
864867
$container->removeDefinition('form.type_extension.upload.validator');
865868
}
869+
870+
if (ContainerBuilder::willBeAvailable('symfony/object-mapper', ObjectMapperInterface::class, ['symfony/framework-bundle'])) {
871+
$loader->load('object_mapper.php');
872+
$container->registerForAutoconfiguration(TransformCallableInterface::class)
873+
->addTag('object_mapper.transform_callable');
874+
$container->registerForAutoconfiguration(ConditionCallableInterface::class)
875+
->addTag('object_mapper.condition_callable');
876+
}
866877
}
867878

EDBE
868879
private function registerHttpCacheConfiguration(array $config, ContainerBuilder $container, bool $httpMethodOverride): void
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
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(ObjectMapperMetadataFactoryInterface::class, 'object_mapper.metadata_factory')
23+
24+
->set('object_mapper', ObjectMapper::class)
25+
->args([
26+
service('object_mapper.metadata_factory'),
27+
service('property_accessor')->ignoreOnInvalid(),
28+
tagged_locator('object_mapper.transform_callable'),
29+
tagged_locator('object_mapper.condition_callable'),
30+
])
31+
->alias(ObjectMapperInterface::class, 'object_mapper')
32+
;
33+
};
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()
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: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@
5454
"symfony/messenger": "^6.4|^7.0",
5555
"symfony/mime": "^6.4|^7.0",
5656
"symfony/notifier": "^6.4|^7.0",
57+
"symfony/object-mapper": "^7.3" 4DFF ;,
5758
"symfony/process": "^6.4|^7.0",
5859
"symfony/rate-limiter": "^6.4|^7.0",
5960
"symfony/scheduler": "^6.4.4|^7.0.4",

0 commit comments

Comments
 (0)
0