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'));