Skip to content

Commit 1bd93ee

Browse files
authored
DI: implement ResolveTargetEntityListener [#102, closes #52]
1 parent 9e2cd91 commit 1bd93ee

File tree

5 files changed

+81
-2
lines changed

5 files changed

+81
-2
lines changed

src/DI/OrmExtension.php

+11
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
use Doctrine\ORM\Configuration;
88
use Doctrine\ORM\EntityManager as DoctrineEntityManager;
99
use Doctrine\ORM\Mapping\UnderscoreNamingStrategy;
10+
use Doctrine\ORM\Tools\ResolveTargetEntityListener;
1011
use Doctrine\Persistence\Mapping\Driver\MappingDriverChain;
1112
use Nette\DI\Definitions\Statement;
1213
use Nette\DI\Helpers;
@@ -43,6 +44,7 @@ public function getConfigSchema(): Schema
4344
'proxyNamespace' => Expect::string('Nettrine\Proxy')->nullable(),
4445
'metadataDriverImpl' => Expect::string(),
4546
'entityNamespaces' => Expect::array(),
47+
'resolveTargetEntities' => Expect::array(),
4648
'customStringFunctions' => Expect::array(),
4749
'customNumericFunctions' => Expect::array(),
4850
'customDatetimeFunctions' => Expect::array(),
@@ -191,6 +193,15 @@ public function loadEntityManagerConfiguration(): void
191193
}
192194
}
193195

196+
if ($config->configuration->resolveTargetEntities !== []) {
197+
$resolver = $builder->addDefinition($this->prefix('targetEntityResolver'))
198+
->setType(ResolveTargetEntityListener::class);
199+
200+
foreach ($config->configuration->resolveTargetEntities as $name => $implementation) {
201+
$resolver->addSetup('addResolveTargetEntity', [$name, $implementation, []]);
202+
}
203+
}
204+
194205
// Manager Registry
195206
$builder->addDefinition($this->prefix('managerRegistry'))
196207
->setFactory(ManagerRegistry::class, [

tests/Cases/DI/OrmAttributesExtension.phpt

+3-2
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ use Nette\DI\InvalidConfigurationException;
1111
use Nettrine\ORM\DI\OrmAttributesExtension;
1212
use Contributte\Tester\Toolkit;
1313
use Tester\Assert;
14+
use Tests\Fixtures\Dummy\DummyEntity;
1415
use Tests\Toolkit\Container;
1516
use Tests\Toolkit\Helpers;
1617

@@ -25,7 +26,7 @@ Toolkit::test(function (): void {
2526
$compiler->addConfig(Helpers::neon('
2627
nettrine.orm.attributes:
2728
mapping:
28-
App\Model\Entity: %appDir%
29+
Tests\Fixtures\Dummy: %appDir%
2930
'));
3031
})
3132
->build();
@@ -37,7 +38,7 @@ Toolkit::test(function (): void {
3738

3839
/** @var AttributeDriver $attributeDriver */
3940
$attributeDriver = current($driver->getDrivers());
40-
Assert::equal([], $attributeDriver->getAllClassNames());
41+
Assert::equal([DummyEntity::class], $attributeDriver->getAllClassNames());
4142
});
4243

4344
// Error (missing mapping)

tests/Cases/DI/OrmExtensionTest.php

+35
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,16 @@
33
use Contributte\Tester\Toolkit;
44
use Doctrine\ORM\Decorator\EntityManagerDecorator;
55
use Nette\DI\Compiler;
6+
use Nettrine\ORM\DI\OrmAttributesExtension;
67
use Nettrine\ORM\Exception\Logical\InvalidArgumentException;
78
use Tester\Assert;
89
use Tests\Fixtures\Dummy\DummyConfiguration;
10+
use Tests\Fixtures\Dummy\DummyEntity;
911
use Tests\Fixtures\Dummy\DummyEntityManagerDecorator;
1012
use Tests\Fixtures\Dummy\DummyFilter;
13+
use Tests\Fixtures\Dummy\DummyIdentity;
1114
use Tests\Toolkit\Container;
15+
use Tests\Toolkit\Helpers;
1216

1317
require_once __DIR__ . '/../../bootstrap.php';
1418

@@ -72,6 +76,37 @@
7276
Assert::equal(false, $filters->isEnabled('autoDisabledFilter'));
7377
});
7478

79+
// ResolveTargetEntityListener
80+
Toolkit::test(function (): void {
81+
$container = Container::of()
82+
->withDefaults()
83+
->withCompiler(static function (Compiler $compiler): void {
84+
$compiler->addExtension('nettrine.orm.attributes', new OrmAttributesExtension());
85+
$compiler->addConfig(Helpers::neon('
86+
nettrine.orm.attributes:
87+
mapping:
88+
Tests\Fixtures\Dummy: %appDir%
89+
'));
90+
91+
$compiler->addConfig([
92+
'nettrine.orm' => [
93+
'configuration' => [
94+
'resolveTargetEntities' => [
95+
DummyIdentity::class => DummyEntity::class,
96+
],
97+
],
98+
],
99+
]);
100+
})
101+
->build();
102+
103+
/** @var EntityManagerDecorator $em */
104+
$em = $container->getService('nettrine.orm.entityManagerDecorator');
105+
$cm = $em->getClassMetadata(DummyIdentity::class);
106+
107+
Assert::equal($cm->name, DummyEntity::class);
108+
});
109+
75110
// Error (configuration subclass)
76111
Toolkit::test(function (): void {
77112
Assert::exception(function (): void {

tests/Fixtures/Dummy/DummyEntity.php

+24
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
<?php declare(strict_types = 1);
2+
3+
namespace Tests\Fixtures\Dummy;
4+
5+
use Doctrine\ORM\Mapping\Column;
6+
use Doctrine\ORM\Mapping\Entity;
7+
use Doctrine\ORM\Mapping\GeneratedValue;
8+
use Doctrine\ORM\Mapping\Id;
9+
10+
#[Entity]
11+
class DummyEntity implements DummyIdentity
12+
{
13+
14+
#[Column(type: 'integer', unique: true, nullable: false)]
15+
#[GeneratedValue(strategy: 'IDENTITY')]
16+
#[Id]
17+
private int $id;
18+
19+
public function getId(): int
20+
{
21+
return $this->id;
22+
}
23+
24+
}
+8
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
<?php declare(strict_types = 1);
2+
3+
namespace Tests\Fixtures\Dummy;
4+
5+
interface DummyIdentity
6+
{
7+
8+
}

0 commit comments

Comments
 (0)