Skip to content

Commit 98069b1

Browse files
authored
Merge pull request #306 from jolicode/feat/object-mapper
Be compatible with Symfony/ObjectMapper
2 parents eda649d + ec15b9c commit 98069b1

File tree

99 files changed

+3144
-102
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

99 files changed

+3144
-102
lines changed

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
1616
- Initial support for nested properties
1717
- Add support for object invokable transformer in attribute transformer
1818
- Add a new interface `PropertyTransformerComputeInterface` to allow property transformers with supports, to compute a value that will be fixed during code generation.
19+
- Support ObjectMapper attributes
20+
- Add an implementation for Symfony `ObjectMapperInterface` using AutoMapper
1921

2022
### Changed
2123
- [BC Break] `PropertyTransformerSupportInterface` does not use a `TypesMatching` anymore, you can get the type directly from `SourcePropertyMetadata` or `TargetPropertyMetadata`.

composer.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@
4646
"symfony/framework-bundle": "^7.4 || ^8.0",
4747
"symfony/http-client": "^7.4 || ^8.0",
4848
"symfony/http-kernel": "^7.4 || ^8.0",
49+
"symfony/object-mapper": "^7.4 || ^8.0",
4950
"symfony/phpunit-bridge": "^8.0",
5051
"symfony/serializer": "^7.4 || ^8.0",
5152
"symfony/stopwatch": "^7.4 || ^8.0",

phpstan.neon

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,3 +4,9 @@ parameters:
44
- src/
55

66
tmpDir: cache
7+
8+
ignoreErrors:
9+
-
10+
message: "#^Method AutoMapper\\\\ObjectMapper\\\\ObjectMapper\\:\\:map\\(\\) should return T of object but returns object\\|null\\.$#"
11+
count: 1
12+
path: src/ObjectMapper/ObjectMapper.php

src/AttributeReference/Reference.php

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,11 @@
44

55
namespace AutoMapper\AttributeReference;
66

7+
use PhpParser\Node\Arg;
8+
use PhpParser\Node\Expr;
9+
use PhpParser\Node\Name;
10+
use PhpParser\Node\Scalar;
11+
712
class Reference
813
{
914
public function __construct(
@@ -14,4 +19,40 @@ public function __construct(
1419
public ?string $methodName = null,
1520
) {
1621
}
22+
23+
public function getReferenceExpression(): Expr
24+
{
25+
if ($this->methodName) {
26+
/** ReflectionReference::fromMethod($className, $methodName) */
27+
return new Expr\StaticCall(
28+
new Name\FullyQualified(ReflectionReference::class),
29+
'fromMethod',
30+
[
31+
new Arg(new Scalar\String_($this->className)),
32+
new Arg(new Scalar\String_($this->methodName)),
33+
]
34+
);
35+
}
36+
37+
if ($this->propertyName) {
38+
/** ReflectionReference::fromProperty($className, $propertyName) */
39+
return new Expr\StaticCall(
40+
new Name\FullyQualified(ReflectionReference::class),
41+
'fromProperty',
42+
[
43+
new Arg(new Scalar\String_($this->className)),
44+
new Arg(new Scalar\String_($this->propertyName)),
45+
]
46+
);
47+
}
48+
49+
/** ReflectionReference::fromClass($className) */
50+
return new Expr\StaticCall(
51+
new Name\FullyQualified(ReflectionReference::class),
52+
'fromClass',
53+
[
54+
new Arg(new Scalar\String_($this->className)),
55+
]
56+
);
57+
}
1758
}

src/AutoMapper.php

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,7 @@ public function mapCollection(iterable $collection, string $target, array $conte
130130
/**
131131
* @param ProviderInterface[] $providers
132132
* @param iterable<string|int, PropertyTransformerInterface> $propertyTransformers
133+
* @param iterable<string|int, object> $extraMapperServices
133134
*
134135
* @return self
135136
*/
@@ -142,6 +143,7 @@ public static function create(
142143
EventDispatcherInterface $eventDispatcher = new EventDispatcher(),
143144
iterable $providers = [],
144145
?ObjectManager $objectManager = null,
146+
iterable $extraMapperServices = [],
145147
): AutoMapperInterface {
146148
if (class_exists(AttributeLoader::class)) {
147149
$loaderClass = new AttributeLoader();
@@ -190,6 +192,14 @@ public static function create(
190192
}
191193
}
192194

195+
foreach ($extraMapperServices as $key => $mapperService) {
196+
if (\is_int($key)) {
197+
$key = $mapperService::class;
198+
}
199+
200+
$serviceLocator->set($key, $mapperService);
201+
}
202+
193203
$metadataRegistry = new MetadataRegistry($configuration);
194204
$classDiscriminatorResolver = new ClassDiscriminatorResolver();
195205

src/Event/GenerateMapperEvent.php

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,19 +7,21 @@
77
use AutoMapper\ConstructorStrategy;
88
use AutoMapper\Metadata\Discriminator;
99
use AutoMapper\Metadata\MapperMetadata;
10+
use AutoMapper\Metadata\Provider;
11+
use Symfony\Contracts\EventDispatcher\Event;
1012

1113
/**
1214
* @internal
1315
*/
14-
final class GenerateMapperEvent
16+
final class GenerateMapperEvent extends Event
1517
{
1618
/**
1719
* @param PropertyMetadataEvent[] $properties A list of properties to add to this mapping
1820
*/
1921
public function __construct(
2022
public readonly MapperMetadata $mapperMetadata,
2123
public array $properties = [],
22-
public ?string $provider = null,
24+
public ?Provider $provider = null,
2325
public ?bool $checkAttributes = null,
2426
public ?ConstructorStrategy $constructorStrategy = null,
2527
public ?bool $allowReadOnlyTargetToPopulate = null,

src/Event/PropertyMetadataEvent.php

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

55
namespace AutoMapper\Event;
66

7+
use AutoMapper\AttributeReference\Reference;
78
use AutoMapper\Metadata\MapperMetadata;
89
use AutoMapper\Transformer\TransformerInterface;
910

@@ -24,7 +25,7 @@ public function __construct(
2425
public ?string $dateTimeFormat = null,
2526
public ?bool $ignored = null,
2627
public ?string $ignoreReason = null,
27-
public ?string $if = null,
28+
public string|Reference|null $if = null,
2829
public ?array $groups = null,
2930
public ?bool $disableGroupsCheck = null,
3031
public int $priority = 0,

src/EventListener/ApiPlatform/JsonLdListener.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
use AutoMapper\Event\PropertyMetadataEvent;
1212
use AutoMapper\Event\SourcePropertyMetadata;
1313
use AutoMapper\Event\TargetPropertyMetadata;
14+
use AutoMapper\Metadata\Provider;
1415
use AutoMapper\Provider\ApiPlatform\IriProvider;
1516
use AutoMapper\Transformer\ApiPlatform\JsonLdContextTransformer;
1617
use AutoMapper\Transformer\ApiPlatform\JsonLdIdTransformer;
@@ -68,7 +69,7 @@ public function __invoke(GenerateMapperEvent $event): void
6869
}
6970

7071
if ($event->mapperMetadata->source === 'array' && $this->resourceClassResolver->isResourceClass($event->mapperMetadata->target)) {
71-
$event->provider ??= IriProvider::class;
72+
$event->provider ??= new Provider(Provider::TYPE_SERVICE, IriProvider::class);
7273
}
7374
}
7475
}

src/EventListener/Doctrine/DoctrineProviderListener.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
namespace AutoMapper\EventListener\Doctrine;
66

77
use AutoMapper\Event\GenerateMapperEvent;
8+
use AutoMapper\Metadata\Provider;
89
use AutoMapper\Provider\Doctrine\DoctrineProvider;
910
use Doctrine\Persistence\ObjectManager;
1011

@@ -21,6 +22,6 @@ public function __invoke(GenerateMapperEvent $event): void
2122
return;
2223
}
2324

24-
$event->provider ??= DoctrineProvider::class;
25+
$event->provider ??= new Provider(Provider::TYPE_SERVICE, DoctrineProvider::class);
2526
}
2627
}

src/EventListener/MapProviderListener.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
use AutoMapper\Attribute\MapProvider;
88
use AutoMapper\Event\GenerateMapperEvent;
99
use AutoMapper\Exception\BadMapDefinitionException;
10+
use AutoMapper\Metadata\Provider;
1011

1112
/**
1213
* @internal
@@ -60,7 +61,7 @@ public function __invoke(GenerateMapperEvent $event): void
6061
if (false === $eventProvider) {
6162
$event->provider = null;
6263
} else {
63-
$event->provider = $eventProvider;
64+
$event->provider = new Provider(Provider::TYPE_SERVICE, $eventProvider);
6465
}
6566
}
6667
}

0 commit comments

Comments
 (0)