Skip to content

Commit 75f6bf5

Browse files
committed
feat: add doctrine/orm v3 compatibility
1 parent e080a50 commit 75f6bf5

File tree

2 files changed

+24
-4
lines changed

2 files changed

+24
-4
lines changed

composer.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@
2929
},
3030
"require-dev": {
3131
"doctrine/annotations": "^2.0",
32-
"doctrine/orm": "^2.9",
32+
"doctrine/orm": "^2.9|^3.0",
3333
"matthiasnoback/symfony-dependency-injection-test": "^4.3 || ^5.0",
3434
"nyholm/psr7": "^1.5.1",
3535
"php-cs-fixer/shim": "^3.14",

src/Services/MeilisearchService.php

+23-3
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
namespace Meilisearch\Bundle\Services;
66

7-
use Doctrine\Common\Util\ClassUtils;
7+
use Doctrine\ORM\Proxy\DefaultProxyClassNameResolver;
88
use Doctrine\Persistence\ObjectManager;
99
use Meilisearch\Bundle\Collection;
1010
use Meilisearch\Bundle\Engine;
@@ -18,6 +18,8 @@
1818
use Symfony\Component\PropertyAccess\PropertyAccessorInterface;
1919
use Symfony\Component\Serializer\Normalizer\NormalizerInterface;
2020

21+
use function class_exists;
22+
2123
final class MeilisearchService implements SearchService
2224
{
2325
private NormalizerInterface $normalizer;
@@ -236,7 +238,7 @@ private function getBaseClassName($objectOrClass): string
236238
}
237239

238240
if (is_object($objectOrClass)) {
239-
return ClassUtils::getClass($objectOrClass);
241+
return self::resolveClass($objectOrClass);
240242
}
241243

242244
return $objectOrClass;
@@ -306,7 +308,7 @@ private function getAggregatorsFromEntities(ObjectManager $objectManager, array
306308
$aggregators = [];
307309

308310
foreach ($entities as $entity) {
309-
$entityClassName = ClassUtils::getClass($entity);
311+
$entityClassName = self::resolveClass($entity);
310312
if (array_key_exists($entityClassName, $this->entitiesAggregators)) {
311313
foreach ($this->entitiesAggregators[$entityClassName] as $aggregator) {
312314
$aggregators[] = new $aggregator(
@@ -367,4 +369,22 @@ private function assertIsSearchable(string $className): void
367369
throw new Exception('Class '.$className.' is not searchable.');
368370
}
369371
}
372+
373+
private static function resolveClass(object $object): string
374+
{
375+
static $resolver;
376+
377+
$resolver ??= (function () {
378+
379+
// Doctrine ORM v3+ compatibility
380+
if (class_exists(DefaultProxyClassNameResolver::class)) {
381+
return fn (object $object) => DefaultProxyClassNameResolver::getClass($object);
382+
}
383+
384+
// Legacy Doctrine ORM compatibility
385+
return fn (object $object) => \Doctrine\Common\Util\ClassUtils::getClass($object);
386+
})();
387+
388+
return $resolver($object);
389+
}
370390
}

0 commit comments

Comments
 (0)