Skip to content

Commit be127ca

Browse files
antonymousAntonymous
andauthored
Implement ProxyResolverInterface (#776)
Co-authored-by: Antonymous <anton.bluvstein@gmail.com>
1 parent 0f78b62 commit be127ca

File tree

2 files changed

+61
-1
lines changed

2 files changed

+61
-1
lines changed

src/Model/ModelManager.php

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,10 @@
1818
use Doctrine\ODM\MongoDB\Mapping\ClassMetadata as MongoDBClassMetadata;
1919
use Doctrine\ODM\MongoDB\Query\Builder;
2020
use Doctrine\ODM\MongoDB\Repository\DocumentRepository;
21+
use Doctrine\Persistence\Mapping\MappingException;
2122
use Sonata\AdminBundle\Datagrid\ProxyQueryInterface as BaseProxyQueryInterface;
2223
use Sonata\AdminBundle\Model\ModelManagerInterface;
24+
use Sonata\AdminBundle\Model\ProxyResolverInterface;
2325
use Sonata\DoctrineMongoDBAdminBundle\Datagrid\ProxyQuery;
2426
use Sonata\DoctrineMongoDBAdminBundle\Datagrid\ProxyQueryInterface;
2527
use Symfony\Bridge\Doctrine\ManagerRegistry;
@@ -30,7 +32,7 @@
3032
*
3133
* @template-implements ModelManagerInterface<T>
3234
*/
33-
final class ModelManager implements ModelManagerInterface
35+
final class ModelManager implements ModelManagerInterface, ProxyResolverInterface
3436
{
3537
public const ID_SEPARATOR = '-';
3638

@@ -240,6 +242,22 @@ public function reverseTransform(object $object, array $array = []): void
240242
}
241243
}
242244

245+
public function getRealClass(object $object): string
246+
{
247+
$class = \get_class($object);
248+
249+
$dm = $this->registry->getManagerForClass($class);
250+
if (null === $dm) {
251+
return $class;
252+
}
253+
254+
try {
255+
return $dm->getClassMetadata($class)->getName();
256+
} catch (MappingException $e) {
257+
return $class;
258+
}
259+
}
260+
243261
/**
244262
* @param MongoDBClassMetadata<T> $metadata
245263
*/

tests/Model/ModelManagerTest.php

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
namespace Sonata\DoctrineMongoDBAdminBundle\Tests\Model;
1515

1616
use Doctrine\ODM\MongoDB\DocumentManager;
17+
use Doctrine\ODM\MongoDB\Mapping\ClassMetadata;
1718
use Doctrine\ODM\MongoDB\Query\Builder;
1819
use Doctrine\ODM\MongoDB\Repository\DocumentRepository;
1920
use PHPUnit\Framework\MockObject\Stub;
@@ -148,6 +149,47 @@ public function testSupportsQuery(bool $expected, object $object): void
148149
static::assertSame($expected, $modelManager->supportsQuery($object));
149150
}
150151

152+
public function testGetRealClassWithProxyObject(): void
153+
{
154+
$proxyClass = TestDocument::class;
155+
/** @var class-string $baseClass */
156+
$baseClass = 'BaseTestDocument';
157+
158+
$classMetadata = $this->createMock(ClassMetadata::class);
159+
$classMetadata->expects(static::once())
160+
->method('getName')
161+
->willReturn($baseClass);
162+
163+
$documentManager = $this->createMock(DocumentManager::class);
164+
$documentManager->expects(static::once())
165+
->method('getClassMetadata')
166+
->with($proxyClass)
167+
->willReturn($classMetadata);
168+
169+
$registry = $this->createMock(ManagerRegistry::class);
170+
$registry->expects(static::once())
171+
->method('getManagerForClass')
172+
->with($proxyClass)
173+
->willReturn($documentManager);
174+
175+
$modelManager = new ModelManager($registry, $this->propertyAccessor);
176+
177+
static::assertSame($baseClass, $modelManager->getRealClass(new TestDocument()));
178+
}
179+
180+
public function testGetRealClassWithNonProxyObject(): void
181+
{
182+
$registry = $this->createMock(ManagerRegistry::class);
183+
$registry->expects(static::once())
184+
->method('getManagerForClass')
185+
->with(\DateTime::class)
186+
->willReturn(null);
187+
188+
$modelManager = new ModelManager($registry, $this->propertyAccessor);
189+
190+
static::assertSame(\DateTime::class, $modelManager->getRealClass(new \DateTime()));
191+
}
192+
151193
/**
152194
* @phpstan-return iterable<array{bool, object}>
153195
*/

0 commit comments

Comments
 (0)