Skip to content

Commit 444e87c

Browse files
authored
Merge pull request #788 from driehle/fix/mongo-odm-driver
Add compatibility for persistence v3 with Mongo ODM
2 parents cb29fac + 6f2b225 commit 444e87c

File tree

3 files changed

+73
-15
lines changed

3 files changed

+73
-15
lines changed

composer.json

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@
6868
},
6969
"require-dev": {
7070
"doctrine/coding-standard": "^9.0.0",
71+
"doctrine/mongodb-odm": "^2.3.0",
7172
"doctrine/orm": "^2.11.1",
7273
"jangregor/phpstan-prophecy": "^1.0.0",
7374
"laminas/laminas-cache-storage-adapter-blackhole": "^2.0.0",
@@ -104,6 +105,9 @@
104105
],
105106
"config": {
106107
"sort-packages": true,
108+
"platform": {
109+
"ext-mongodb": "1.8.0"
110+
},
107111
"allow-plugins": {
108112
"dealerdirect/phpcodesniffer-composer-installer": true
109113
}

src/Service/DriverFactory.php

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,10 @@
55
namespace DoctrineModule\Service;
66

77
use Doctrine\Common\Annotations;
8-
use Doctrine\ORM\Mapping\Driver\AnnotationDriver;
9-
use Doctrine\ORM\Mapping\Driver\AttributeDriver;
8+
use Doctrine\ODM\MongoDB\Mapping\Driver\AnnotationDriver as MongoODMAnnotationDriver;
9+
use Doctrine\ODM\MongoDB\Mapping\Driver\AttributeDriver as MongoODMAttributeDriver;
10+
use Doctrine\ORM\Mapping\Driver\AnnotationDriver as ORMAnnotationDriver;
11+
use Doctrine\ORM\Mapping\Driver\AttributeDriver as ORMAttributeDriver;
1012
use Doctrine\Persistence\Mapping\Driver\DefaultFileLocator;
1113
use Doctrine\Persistence\Mapping\Driver\FileDriver;
1214
use Doctrine\Persistence\Mapping\Driver\MappingDriver;
@@ -18,7 +20,7 @@
1820

1921
use function class_exists;
2022
use function get_class;
21-
use function is_subclass_of;
23+
use function is_a;
2224
use function sprintf;
2325

2426
/**
@@ -71,8 +73,12 @@ protected function createDriver(ContainerInterface $container, Driver $options):
7173

7274
// Special options for AnnotationDrivers.
7375
if (
74-
$class !== AttributeDriver::class &&
75-
($class === AnnotationDriver::class || is_subclass_of($class, AnnotationDriver::class))
76+
$class !== ORMAttributeDriver::class &&
77+
$class !== MongoODMAttributeDriver::class &&
78+
(
79+
is_a($class, ORMAnnotationDriver::class, true) ||
80+
is_a($class, MongoODMAnnotationDriver::class, true)
81+
)
7682
) {
7783
$reader = new Annotations\AnnotationReader();
7884
$reader = new Annotations\CachedReader(

tests/Service/DriverFactoryTest.php

Lines changed: 58 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,10 @@
66

77
use Doctrine\Common\Annotations\Reader;
88
use Doctrine\Common\Cache\ArrayCache;
9-
use Doctrine\ORM\Mapping\Driver\AnnotationDriver;
10-
use Doctrine\ORM\Mapping\Driver\AttributeDriver;
9+
use Doctrine\ODM\MongoDB\Mapping\Driver\AnnotationDriver as MongoDBODMAnnotationDriver;
10+
use Doctrine\ODM\MongoDB\Mapping\Driver\AttributeDriver as MongoDBODMAttributeDriver;
11+
use Doctrine\ORM\Mapping\Driver\AnnotationDriver as ORMAnnotationDriver;
12+
use Doctrine\ORM\Mapping\Driver\AttributeDriver as ORMAttributeDriver;
1113
use Doctrine\Persistence\Mapping\Driver\MappingDriverChain;
1214
use DoctrineModule\Service\DriverFactory;
1315
use DoctrineModuleTest\Service\Mock\MetadataDriverMock;
@@ -75,34 +77,80 @@ public function testCreateDriverChain(): void
7577
/**
7678
* @requires PHP 8.0
7779
*/
78-
public function testCreateAttributeDriver(): void
80+
public function testCreateORMAttributeDriver(): void
7981
{
8082
$serviceManager = new ServiceManager();
8183
$serviceManager->setService(
8284
'config',
8385
[
8486
'doctrine' => [
8587
'driver' => [
86-
'testDriver' => ['class' => AttributeDriver::class],
88+
'testDriver' => ['class' => ORMAttributeDriver::class],
8789
],
8890
],
8991
]
9092
);
9193

9294
$factory = new DriverFactory('testDriver');
93-
$driver = $factory->__invoke($serviceManager, AttributeDriver::class);
94-
$this->assertInstanceOf(AttributeDriver::class, $driver);
95+
$driver = $factory->__invoke($serviceManager, ORMAttributeDriver::class);
96+
$this->assertInstanceOf(ORMAttributeDriver::class, $driver);
9597
}
9698

97-
public function testCreateAnnotationDriver(): void
99+
/**
100+
* @requires PHP 8.0
101+
*/
102+
public function testCreateMongoDBODMAttributeDriver(): void
103+
{
104+
$serviceManager = new ServiceManager();
105+
$serviceManager->setService(
106+
'config',
107+
[
108+
'doctrine' => [
109+
'driver' => [
110+
'testDriver' => ['class' => MongoDBODMAttributeDriver::class],
111+
],
112+
],
113+
]
114+
);
115+
116+
$factory = new DriverFactory('testDriver');
117+
$driver = $factory->__invoke($serviceManager, MongoDBODMAttributeDriver::class);
118+
$this->assertInstanceOf(MongoDBODMAttributeDriver::class, $driver);
119+
}
120+
121+
public function testCreateORMAnnotationDriver(): void
122+
{
123+
$serviceManager = new ServiceManager();
124+
$serviceManager->setService(
125+
'config',
126+
[
127+
'doctrine' => [
128+
'driver' => [
129+
'testDriver' => ['class' => ORMAnnotationDriver::class],
130+
],
131+
],
132+
]
133+
);
134+
$serviceManager->setService(
135+
'doctrine.cache.array',
136+
new ArrayCache()
137+
);
138+
139+
$factory = new DriverFactory('testDriver');
140+
$driver = $factory->__invoke($serviceManager, ORMAnnotationDriver::class);
141+
$this->assertInstanceOf(ORMAnnotationDriver::class, $driver);
142+
$this->assertInstanceOf(Reader::class, $driver->getReader());
143+
}
144+
145+
public function testCreateMongoDBODMAnnotationDriver(): void
98146
{
99147
$serviceManager = new ServiceManager();
100148
$serviceManager->setService(
101149
'config',
102150
[
103151
'doctrine' => [
104152
'driver' => [
105-
'testDriver' => ['class' => AnnotationDriver::class],
153+
'testDriver' => ['class' => MongoDBODMAnnotationDriver::class],
106154
],
107155
],
108156
]
@@ -113,8 +161,8 @@ public function testCreateAnnotationDriver(): void
113161
);
114162

115163
$factory = new DriverFactory('testDriver');
116-
$driver = $factory->__invoke($serviceManager, AnnotationDriver::class);
117-
$this->assertInstanceOf(AnnotationDriver::class, $driver);
164+
$driver = $factory->__invoke($serviceManager, MongoDBODMAnnotationDriver::class);
165+
$this->assertInstanceOf(MongoDBODMAnnotationDriver::class, $driver);
118166
$this->assertInstanceOf(Reader::class, $driver->getReader());
119167
}
120168
}

0 commit comments

Comments
 (0)