diff --git a/DependencyInjection/Configuration.php b/DependencyInjection/Configuration.php
index ba8b85e1c..7bbf20219 100644
--- a/DependencyInjection/Configuration.php
+++ b/DependencyInjection/Configuration.php
@@ -214,7 +214,8 @@ private function addOrmSection(ArrayNodeDefinition $node)
// Key that should not be rewritten to the connection config
$excludedKeys = array(
'default_entity_manager' => true, 'auto_generate_proxy_classes' => true,
- 'proxy_dir' => true, 'proxy_namespace' => true,
+ 'proxy_dir' => true, 'proxy_namespace' => true, 'resolve_target_entities' => true,
+ 'resolve_target_entity' => true,
);
$entityManager = array();
foreach ($v as $key => $value) {
@@ -238,11 +239,28 @@ private function addOrmSection(ArrayNodeDefinition $node)
->end()
->fixXmlConfig('entity_manager')
->append($this->getOrmEntityManagersNode())
+ ->fixXmlConfig('resolve_target_entity', 'resolve_target_entities')
+ ->append($this->getOrmTargetEntityResolverNode())
->end()
->end()
;
}
+ private function getOrmTargetEntityResolverNode()
+ {
+ $treeBuilder = new TreeBuilder();
+ $node = $treeBuilder->root('resolve_target_entities');
+
+ $node
+ ->useAttributeAsKey('interface')
+ ->prototype('scalar')
+ ->cannotBeEmpty()
+ ->end()
+ ;
+
+ return $node;
+ }
+
private function getOrmEntityManagersNode()
{
$treeBuilder = new TreeBuilder();
diff --git a/DependencyInjection/DoctrineExtension.php b/DependencyInjection/DoctrineExtension.php
index 0fb3b7b94..224527cd0 100644
--- a/DependencyInjection/DoctrineExtension.php
+++ b/DependencyInjection/DoctrineExtension.php
@@ -238,6 +238,17 @@ protected function ormLoad(array $config, ContainerBuilder $container)
$entityManager['name'] = $name;
$this->loadOrmEntityManager($entityManager, $container);
}
+
+ if ($config['resolve_target_entities']) {
+ $def = $container->findDefinition('doctrine.orm.listeners.resolve_target_entity');
+ foreach ($config['resolve_target_entities'] as $name => $implementation) {
+ $def->addMethodCall('addResolveTargetEntity', array(
+ $name, $implementation, array()
+ ));
+ }
+
+ $def->addTag('doctrine.event_listener', array('event' => 'loadClassMetadata'));
+ }
}
/**
diff --git a/Resources/config/orm.xml b/Resources/config/orm.xml
index afb6cbba6..211fe7aae 100644
--- a/Resources/config/orm.xml
+++ b/Resources/config/orm.xml
@@ -42,6 +42,9 @@
Symfony\Bridge\Doctrine\Security\User\EntityUserProvider
+
+
+ Doctrine\ORM\Tools\ResolveTargetEntityListener
@@ -87,5 +90,8 @@
+
+
+
diff --git a/Resources/config/schema/doctrine-1.0.xsd b/Resources/config/schema/doctrine-1.0.xsd
index 9aa841fdc..76170b95d 100644
--- a/Resources/config/schema/doctrine-1.0.xsd
+++ b/Resources/config/schema/doctrine-1.0.xsd
@@ -110,6 +110,7 @@
+
@@ -125,6 +126,14 @@
+
+
+
+
+
+
+
+
diff --git a/Tests/ContainerTest.php b/Tests/ContainerTest.php
index e8e2c42c4..83de54ce6 100644
--- a/Tests/ContainerTest.php
+++ b/Tests/ContainerTest.php
@@ -30,6 +30,7 @@ protected function setUp()
public function testContainer()
{
$container = $this->createYamlBundleTestContainer();
+
$this->assertInstanceOf('Symfony\Bridge\Doctrine\Logger\DbalLogger', $container->get('doctrine.dbal.logger'));
$this->assertInstanceOf('Symfony\Bridge\Doctrine\DataCollector\DoctrineDataCollector', $container->get('data_collector.doctrine'));
$this->assertInstanceOf('Doctrine\DBAL\Configuration', $container->get('doctrine.dbal.default_connection.configuration'));
diff --git a/Tests/DependencyInjection/AbstractDoctrineExtensionTest.php b/Tests/DependencyInjection/AbstractDoctrineExtensionTest.php
index 90a4e426f..b200fc36d 100644
--- a/Tests/DependencyInjection/AbstractDoctrineExtensionTest.php
+++ b/Tests/DependencyInjection/AbstractDoctrineExtensionTest.php
@@ -733,6 +733,7 @@ public function testAddFilter()
$loader = new DoctrineExtension();
$container->registerExtension($loader);
+
$this->loadFromFile($container, 'orm_filters');
$this->compileContainer($container);
@@ -748,6 +749,21 @@ public function testAddFilter()
$this->assertCount(1, $entityManager->getFilters()->getEnabledFilters());
}
+ public function testResolveTargetEntity()
+ {
+ $container = $this->getContainer(array('YamlBundle'));
+
+ $loader = new DoctrineExtension();
+ $container->registerExtension($loader);
+
+ $this->loadFromFile($container, 'orm_resolve_target_entity');
+ $this->compileContainer($container);
+
+ $definition = $container->getDefinition('doctrine.orm.listeners.resolve_target_entity');
+ $this->assertDICDefinitionMethodCallOnce($definition, 'addResolveTargetEntity', array('Symfony\Component\Security\Core\User\UserInterface', 'MyUserClass', array()));
+ $this->assertEquals(array('doctrine.event_listener' => array( array('event' => 'loadClassMetadata') ) ), $definition->getTags());
+ }
+
protected function getContainer($bundles = 'YamlBundle', $vendor = null)
{
$bundles = (array) $bundles;
diff --git a/Tests/DependencyInjection/Fixtures/config/xml/orm_resolve_target_entity.xml b/Tests/DependencyInjection/Fixtures/config/xml/orm_resolve_target_entity.xml
new file mode 100644
index 000000000..6890cd0ce
--- /dev/null
+++ b/Tests/DependencyInjection/Fixtures/config/xml/orm_resolve_target_entity.xml
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
+
+
+
+ MyUserClass
+
+
+
diff --git a/Tests/DependencyInjection/Fixtures/config/yml/orm_resolve_target_entity.yml b/Tests/DependencyInjection/Fixtures/config/yml/orm_resolve_target_entity.yml
new file mode 100644
index 000000000..4bdbedd78
--- /dev/null
+++ b/Tests/DependencyInjection/Fixtures/config/yml/orm_resolve_target_entity.yml
@@ -0,0 +1,10 @@
+doctrine:
+ dbal:
+ default_connection: default
+ connections:
+ default:
+ dbname: db
+
+ orm:
+ resolve_target_entities:
+ Symfony\Component\Security\Core\User\UserInterface: MyUserClass
diff --git a/Tests/TestCase.php b/Tests/TestCase.php
index a361ef6e5..b8857d8b5 100644
--- a/Tests/TestCase.php
+++ b/Tests/TestCase.php
@@ -15,10 +15,12 @@
namespace Doctrine\Bundle\DoctrineBundle\Tests;
use Doctrine\Common\Annotations\AnnotationReader;
+use Doctrine\Bundle\DoctrineBundle\DependencyInjection\DoctrineExtension;
+
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBag;
-use Doctrine\Bundle\DoctrineBundle\DependencyInjection\DoctrineExtension;
use Symfony\Component\DependencyInjection\Compiler\ResolveDefinitionTemplatesPass;
+use Symfony\Bridge\Doctrine\DependencyInjection\CompilerPass\RegisterEventListenersAndSubscribersPass;
class TestCase extends \PHPUnit_Framework_TestCase
{
@@ -63,8 +65,11 @@ public function createYamlBundleTestContainer()
'dir' => __DIR__.'/DependencyInjection/Fixtures/Bundles/YamlBundle/Resources/config/doctrine',
'prefix' => 'Fixtures\Bundles\YamlBundle\Entity',
)
- )
- )))
+ ))),
+ 'resolve_target_entities' => array(
+ 'Symfony\Component\Security\Core\User\UserInterface' => 'stdClass',
+ ),
+ )
)), $container);
$container->setDefinition('my.platform', new \Symfony\Component\DependencyInjection\Definition('Doctrine\DBAL\Platforms\MySqlPlatform'));