Skip to content

Commit 2771bbd

Browse files
committed
feat(doctrine): support odm / phpcr manager
1 parent 55436b6 commit 2771bbd

File tree

11 files changed

+63
-30
lines changed

11 files changed

+63
-30
lines changed

composer.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@
3434
"doctrine/doctrine-bundle": "^2.15",
3535
"doctrine/collections": "^2.2",
3636
"doctrine/inflector": "^2.0",
37-
"doctrine/orm": "^3.3",
37+
"doctrine/orm": "^2.0 || ^3.0",
3838
"matthiasnoback/symfony-dependency-injection-test": "^5.1",
3939
"moneyphp/money": "^3.3.2",
4040
"phpunit/phpunit": "^9.0",

src/AutoMapper.php

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
use AutoMapper\Transformer\PropertyTransformer\PropertyTransformerRegistry;
2121
use AutoMapper\Transformer\TransformerFactoryInterface;
2222
use Doctrine\Common\Annotations\AnnotationReader;
23-
use Doctrine\ORM\EntityManagerInterface;
23+
use Doctrine\Persistence\ObjectManager;
2424
use Symfony\Component\EventDispatcher\EventDispatcher;
2525
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
2626
use Symfony\Component\ExpressionLanguage\ExpressionLanguage;
@@ -150,7 +150,7 @@ public static function create(
150150
EventDispatcherInterface $eventDispatcher = new EventDispatcher(),
151151
iterable $providers = [],
152152
bool $removeDefaultProperties = false,
153-
?EntityManagerInterface $entityManager = null,
153+
?ObjectManager $objectManager = null,
154154
): AutoMapperInterface {
155155
if (\count($transformerFactories) > 0) {
156156
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__);
@@ -181,8 +181,8 @@ public static function create(
181181

182182
$providers = iterator_to_array($providers);
183183

184-
if (null !== $entityManager) {
185-
$providers[] = new DoctrineProvider($entityManager);
184+
if (null !== $objectManager) {
185+
$providers[] = new DoctrineProvider($objectManager);
186186
}
187187

188188
$customTransformerRegistry = new PropertyTransformerRegistry($propertyTransformers);
@@ -201,7 +201,7 @@ public static function create(
201201
$expressionLanguage,
202202
$eventDispatcher,
203203
$removeDefaultProperties,
204-
$entityManager,
204+
$objectManager,
205205
);
206206

207207
$mapperGenerator = new MapperGenerator(

src/EventListener/Doctrine/DoctrineIdentifierListener.php

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,22 +5,22 @@
55
namespace AutoMapper\EventListener\Doctrine;
66

77
use AutoMapper\Event\PropertyMetadataEvent;
8-
use Doctrine\ORM\EntityManagerInterface;
8+
use Doctrine\Persistence\ObjectManager;
99

1010
final readonly class DoctrineIdentifierListener
1111
{
1212
public function __construct(
13-
private EntityManagerInterface $entityManager
13+
private ObjectManager $objectManager
1414
) {
1515
}
1616

1717
public function __invoke(PropertyMetadataEvent $event): void
1818
{
19-
if ($event->mapperMetadata->target === 'array' || !$this->entityManager->getMetadataFactory()->hasMetadataFor($event->mapperMetadata->target)) {
19+
if ($event->mapperMetadata->target === 'array' || !$this->objectManager->getMetadataFactory()->hasMetadataFor($event->mapperMetadata->target)) {
2020
return;
2121
}
2222

23-
$metadata = $this->entityManager->getClassMetadata($event->mapperMetadata->target);
23+
$metadata = $this->objectManager->getClassMetadata($event->mapperMetadata->target);
2424

2525
if ($metadata->isIdentifier($event->target->property)) {
2626
$event->identifier = true;

src/EventListener/Doctrine/DoctrineProviderListener.php

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,18 +6,18 @@
66

77
use AutoMapper\Event\GenerateMapperEvent;
88
use AutoMapper\Provider\Doctrine\DoctrineProvider;
9-
use Doctrine\ORM\EntityManagerInterface;
9+
use Doctrine\Persistence\ObjectManager;
1010

1111
final readonly class DoctrineProviderListener
1212
{
1313
public function __construct(
14-
private EntityManagerInterface $entityManager
14+
private ObjectManager $objectManager
1515
) {
1616
}
1717

1818
public function __invoke(GenerateMapperEvent $event): void
1919
{
20-
if ($event->mapperMetadata->target === 'array' || !$this->entityManager->getMetadataFactory()->hasMetadataFor($event->mapperMetadata->target)) {
20+
if ($event->mapperMetadata->target === 'array' || !$this->objectManager->getMetadataFactory()->hasMetadataFor($event->mapperMetadata->target)) {
2121
return;
2222
}
2323

src/Metadata/MetadataFactory.php

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@
4646
use AutoMapper\Transformer\TransformerFactoryInterface;
4747
use AutoMapper\Transformer\UniqueTypeTransformerFactory;
4848
use AutoMapper\Transformer\VoidTransformer;
49-
use Doctrine\ORM\EntityManagerInterface;
49+
use Doctrine\Persistence\ObjectManager;
5050
use Symfony\Component\EventDispatcher\EventDispatcher;
5151
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
5252
use Symfony\Component\ExpressionLanguage\ExpressionLanguage;
@@ -358,7 +358,7 @@ public static function create(
358358
ExpressionLanguage $expressionLanguage = new ExpressionLanguage(),
359359
EventDispatcherInterface $eventDispatcher = new EventDispatcher(),
360360
bool $removeDefaultProperties = false,
361-
?EntityManagerInterface $entityManager = null,
361+
?ObjectManager $objectManager = null,
362362
): self {
363363
// Create property info extractors
364364
$flags = ReflectionExtractor::ALLOW_PUBLIC;
@@ -380,9 +380,9 @@ public static function create(
380380
$eventDispatcher->addListener(PropertyMetadataEvent::class, new AdvancedNameConverterListener($nameConverter));
381381
}
382382

383-
if (null !== $entityManager) {
384-
$eventDispatcher->addListener(GenerateMapperEvent::class, new DoctrineProviderListener($entityManager));
385-
$eventDispatcher->addListener(PropertyMetadataEvent::class, new DoctrineIdentifierListener($entityManager));
383+
if (null !== $objectManager) {
384+
$eventDispatcher->addListener(GenerateMapperEvent::class, new DoctrineProviderListener($objectManager));
385+
$eventDispatcher->addListener(PropertyMetadataEvent::class, new DoctrineIdentifierListener($objectManager));
386386
}
387387

388388
$eventDispatcher->addListener(PropertyMetadataEvent::class, new MapToContextListener($reflectionExtractor));

src/Provider/Doctrine/DoctrineProvider.php

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,12 @@
55
namespace AutoMapper\Provider\Doctrine;
66

77
use AutoMapper\Provider\ProviderInterface;
8-
use Doctrine\ORM\EntityManagerInterface;
8+
use Doctrine\Persistence\ObjectManager;
99

1010
final readonly class DoctrineProvider implements ProviderInterface
1111
{
1212
public function __construct(
13-
private EntityManagerInterface $entityManager
13+
private ObjectManager $objectManager
1414
) {
1515
}
1616

@@ -19,11 +19,10 @@ public function __construct(
1919
*/
2020
public function provide(string $targetType, mixed $source, array $context, /* mixed $id */): object|array|null
2121
{
22-
$repository = $this->entityManager->getRepository($targetType);
2322
$id = 4 <= \func_num_args() ? func_get_arg(3) : null;
2423

2524
if ($id !== null) {
26-
return $repository->find($id);
25+
return $this->objectManager->find($targetType, $id);
2726
}
2827

2928
return null;

src/Symfony/Bundle/AutoMapperBundle.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
namespace AutoMapper\Symfony\Bundle;
66

77
use AutoMapper\Symfony\Bundle\DependencyInjection\AutoMapperExtension;
8+
use AutoMapper\Symfony\Bundle\DependencyInjection\Compiler\DoctrineCompilerPass;
89
use AutoMapper\Symfony\Bundle\DependencyInjection\Compiler\TransformerFactoryPass;
910
use Symfony\Component\DependencyInjection\ContainerBuilder;
1011
use Symfony\Component\DependencyInjection\Extension\ExtensionInterface;
@@ -16,6 +17,7 @@ public function build(ContainerBuilder $container): void
1617
{
1718
parent::build($container);
1819

20+
$container->addCompilerPass(new DoctrineCompilerPass());
1921
$container->addCompilerPass(new TransformerFactoryPass());
2022
}
2123

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace AutoMapper\Symfony\Bundle\DependencyInjection\Compiler;
6+
7+
use AutoMapper\EventListener\Doctrine\DoctrineIdentifierListener;
8+
use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
9+
use Symfony\Component\DependencyInjection\ContainerBuilder;
10+
11+
class DoctrineCompilerPass implements CompilerPassInterface
12+
{
13+
public function process(ContainerBuilder $container): void
14+
{
15+
if ($container->has('automapper.doctrine.object_manager')) {
16+
return;
17+
}
18+
19+
if (!$container->has(DoctrineIdentifierListener::class)) {
20+
return;
21+
}
22+
23+
if ($container->has('doctrine.orm.entity_manager')) {
24+
$container->setAlias('automapper.doctrine.object_manager', 'doctrine.orm.entity_manager');
25+
} elseif ($container->has('doctrine_mongodb.odm.document_manager')) {
26+
$container->setAlias('automapper.doctrine.object_manager', 'doctrine_mongodb.odm.document_manager');
27+
} elseif ($container->has('doctrine_phpcr.odm.document_manager')) {
28+
$container->setAlias('automapper.doctrine.object_manager', 'doctrine_phpcr.odm.document_manager');
29+
} else {
30+
throw new \LogicException('The AutoMapper Doctrine integration is enabled but no Doctrine ObjectManager service was found. Please configure the "automapper.doctrine.object_manager" service alias to point to your Doctrine ObjectManager service.');
31+
}
32+
}
33+
}

src/Symfony/Bundle/Resources/config/doctrine.php

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,20 +9,19 @@
99
use AutoMapper\EventListener\Doctrine\DoctrineIdentifierListener;
1010
use AutoMapper\EventListener\Doctrine\DoctrineProviderListener;
1111
use AutoMapper\Provider\Doctrine\DoctrineProvider;
12-
use Doctrine\ORM\EntityManagerInterface;
1312

1413
return static function (ContainerConfigurator $container) {
1514
$container->services()
1615
->set(DoctrineIdentifierListener::class)
17-
->args([service(EntityManagerInterface::class)])
16+
->args([service('automapper.doctrine.object_manager')])
1817
->tag('kernel.event_listener', ['event' => PropertyMetadataEvent::class, 'priority' => 0])
1918

2019
->set(DoctrineProviderListener::class)
21-
->args([service(EntityManagerInterface::class)])
20+
->args([service('automapper.doctrine.object_manager')])
2221
->tag('kernel.event_listener', ['event' => GenerateMapperEvent::class, 'priority' => 0])
2322

2423
->set(DoctrineProvider::class)
25-
->args([service(EntityManagerInterface::class)])
24+
->args([service('automapper.doctrine.object_manager')])
2625
->tag('automapper.provider', ['priority' => 0])
2726
;
2827
};

tests/AutoMapperBuilder.php

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
use AutoMapper\Configuration;
99
use AutoMapper\ConstructorStrategy;
1010
use AutoMapper\Symfony\ExpressionLanguageProvider;
11-
use Doctrine\ORM\EntityManagerInterface;
11+
use Doctrine\Persistence\ObjectManager;
1212
use Symfony\Component\EventDispatcher\EventDispatcher;
1313
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
1414
use Symfony\Component\Filesystem\Filesystem;
@@ -30,7 +30,7 @@ public static function buildAutoMapper(
3030
?ExpressionLanguageProvider $expressionLanguageProvider = null,
3131
EventDispatcherInterface $eventDispatcher = new EventDispatcher(),
3232
bool $removeDefaultProperties = false,
33-
?EntityManagerInterface $entityManager = null,
33+
?ObjectManager $objectManager = null,
3434
): AutoMapper {
3535
$skipCacheRemove = $_SERVER['SKIP_CACHE_REMOVE'] ?? false;
3636

@@ -56,7 +56,7 @@ classPrefix: $classPrefix,
5656
eventDispatcher: $eventDispatcher,
5757
providers: $providers,
5858
removeDefaultProperties: $removeDefaultProperties,
59-
entityManager: $entityManager,
59+
objectManager: $objectManager,
6060
);
6161
}
6262
}

0 commit comments

Comments
 (0)