Skip to content

Commit 0ca92b6

Browse files
committed
feat(extractor): remove default property mapping, if at least one attribute is set
1 parent eeb0728 commit 0ca92b6

File tree

6 files changed

+46
-3
lines changed

6 files changed

+46
-3
lines changed

src/AutoMapper.php

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,7 @@ public static function create(
147147
?ExpressionLanguageProvider $expressionLanguageProvider = null,
148148
EventDispatcherInterface $eventDispatcher = new EventDispatcher(),
149149
iterable $providers = [],
150+
bool $removeDefaultProperties = false,
150151
): AutoMapperInterface {
151152
if (\count($transformerFactories) > 0) {
152153
trigger_deprecation('jolicode/automapper', '9.0', 'The "$transformerFactories" property will be removed in version 10.0, AST transformer factories must be included within AutoMapper.', __METHOD__);
@@ -189,7 +190,8 @@ public static function create(
189190
$classMetadataFactory,
190191
$nameConverter,
191192
$expressionLanguage,
192-
$eventDispatcher
193+
$eventDispatcher,
194+
$removeDefaultProperties,
193195
);
194196

195197
$mapperGenerator = new MapperGenerator(

src/Event/PropertyMetadataEvent.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ public function __construct(
3030
public ?array $groups = null,
3131
public ?bool $disableGroupsCheck = null,
3232
public int $priority = 0,
33+
public readonly bool $isFromDefaultExtractor = false,
3334
) {
3435
}
3536
}

src/Metadata/MetadataFactory.php

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,11 @@ public function __construct(
7171
private readonly EventDispatcherInterface $eventDispatcher,
7272
public readonly MetadataRegistry $metadataRegistry,
7373
private readonly ClassDiscriminatorResolver $classDiscriminatorResolver,
74+
private readonly bool $removeDefaultProperties = false,
7475
) {
76+
if (!$this->removeDefaultProperties) {
77+
trigger_deprecation('jolicode/automapper', '9.4', 'Not removing default properties is deprecated, pass this parameter to true and add necessary attributes if needed', __CLASS__);
78+
}
7579
}
7680

7781
/**
@@ -189,7 +193,7 @@ private function createGeneratorMetadata(MapperMetadata $mapperMetadata): Genera
189193

190194
// First get properties from the source
191195
foreach ($extractor->getProperties($mapperMetadata->source) as $property) {
192-
$propertyEvent = new PropertyMetadataEvent($mapperMetadata, new SourcePropertyMetadataEvent($property), new TargetPropertyMetadataEvent($property));
196+
$propertyEvent = new PropertyMetadataEvent($mapperMetadata, new SourcePropertyMetadataEvent($property), new TargetPropertyMetadataEvent($property), isFromDefaultExtractor: true);
193197

194198
$this->eventDispatcher->dispatch($propertyEvent);
195199

@@ -201,7 +205,7 @@ private function createGeneratorMetadata(MapperMetadata $mapperMetadata): Genera
201205
continue;
202206
}
203207

204-
$propertyEvent = new PropertyMetadataEvent($mapperMetadata, new SourcePropertyMetadataEvent($property), new TargetPropertyMetadataEvent($property));
208+
$propertyEvent = new PropertyMetadataEvent($mapperMetadata, new SourcePropertyMetadataEvent($property), new TargetPropertyMetadataEvent($property), isFromDefaultExtractor: true);
205209

206210
$this->eventDispatcher->dispatch($propertyEvent);
207211

@@ -211,6 +215,15 @@ private function createGeneratorMetadata(MapperMetadata $mapperMetadata): Genera
211215
foreach ($mapperEvent->properties as $propertyEvent) {
212216
$this->eventDispatcher->dispatch($propertyEvent);
213217

218+
if ($this->removeDefaultProperties) {
219+
foreach ($propertyEvents as $propertyEventExisting) {
220+
if ($propertyEventExisting->source->property === $propertyEvent->source->property && $propertyEventExisting->isFromDefaultExtractor && !$propertyEventExisting->ignored) {
221+
$propertyEventExisting->ignored = true;
222+
$propertyEventExisting->ignoreReason = 'Default property is ignored because a custom property is defined.';
223+
}
224+
}
225+
}
226+
214227
$propertyEvents[$propertyEvent->target->property] = $propertyEvent;
215228
}
216229

@@ -332,6 +345,7 @@ public static function create(
332345
AdvancedNameConverterInterface|NameConverterInterface|null $nameConverter = null,
333346
ExpressionLanguage $expressionLanguage = new ExpressionLanguage(),
334347
EventDispatcherInterface $eventDispatcher = new EventDispatcher(),
348+
bool $removeDefaultProperties = false,
335349
): self {
336350
// Create property info extractors
337351
$flags = ReflectionExtractor::ALLOW_PUBLIC;
@@ -420,6 +434,7 @@ public static function create(
420434
$eventDispatcher,
421435
$metadataRegistry,
422436
$classDiscriminatorResolver,
437+
$removeDefaultProperties,
423438
);
424439
}
425440
}

tests/AutoMapperBaseTest.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ protected function buildAutoMapper(
3737
string $dateTimeFormat = \DateTimeInterface::RFC3339,
3838
?ExpressionLanguageProvider $expressionLanguageProvider = null,
3939
EventDispatcherInterface $eventDispatcher = new EventDispatcher(),
40+
bool $removeDefaultProperties = false,
4041
): AutoMapper {
4142
$skipCacheRemove = $_SERVER['SKIP_CACHE_REMOVE'] ?? false;
4243

@@ -61,6 +62,7 @@ classPrefix: $classPrefix,
6162
expressionLanguageProvider: $expressionLanguageProvider,
6263
eventDispatcher: $eventDispatcher,
6364
providers: $providers,
65+
removeDefaultProperties: $removeDefaultProperties,
6466
);
6567
}
6668
}

tests/Fixtures/User.php

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

55
namespace AutoMapper\Tests\Fixtures;
66

7+
use AutoMapper\Attribute\MapTo;
8+
79
class User
810
{
911
/**
1012
* @var int
1113
*/
14+
#[MapTo(target: 'array', property: '_id')]
1215
private $id;
1316

1417
/**

tests/Normalizer/AutoMapperNormalizerTest.php

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,26 @@ public function testNormalize(): void
6767
$normalized = $this->normalizer->normalize($object);
6868
self::assertIsArray($normalized);
6969
self::assertEquals($expected['id'], $normalized['id']);
70+
self::assertEquals($expected['id'], $normalized['_id']);
71+
self::assertEquals($expected['name'], $normalized['name']);
72+
self::assertEquals($expected['age'], $normalized['age']);
73+
}
74+
75+
public function testNormalizeNoDefaultProperties(): void
76+
{
77+
$object = new Fixtures\User(1, 'Jack', 37);
78+
$expected = ['id' => 1, 'name' => 'Jack', 'age' => 37];
79+
80+
$normalizer = new AutoMapperNormalizer($this->buildAutoMapper(
81+
mapPrivatePropertiesAndMethod: true,
82+
classPrefix: 'AutoMapperNoDefaultProperties_',
83+
removeDefaultProperties: true
84+
));
85+
$normalized = $normalizer->normalize($object);
86+
87+
self::assertIsArray($normalized);
88+
self::assertArrayNotHasKey('id', $normalized);
89+
self::assertEquals($expected['id'], $normalized['_id']);
7090
self::assertEquals($expected['name'], $normalized['name']);
7191
self::assertEquals($expected['age'], $normalized['age']);
7292
}

0 commit comments

Comments
 (0)