diff --git a/DependencyInjection/Compiler/RegisterMappingsPass.php b/DependencyInjection/Compiler/RegisterMappingsPass.php index da2de8700f..58e68551a6 100644 --- a/DependencyInjection/Compiler/RegisterMappingsPass.php +++ b/DependencyInjection/Compiler/RegisterMappingsPass.php @@ -33,18 +33,27 @@ class RegisterMappingsPass implements CompilerPassInterface private $namespaces; private $enabledParameter; private $fallbackManagerParameter; + private $configurationPattern; + private $registerAliasMethodName; + private $aliasMap; - public function __construct($driver, $driverPattern, $namespaces, $enabledParameter, $fallbackManagerParameter) + public function __construct($driver, $driverPattern, $namespaces, $enabledParameter, $fallbackManagerParameter, $configurationPattern = '', $registerAliasMethodName = '', array $aliasMap = array()) { $this->driver = $driver; $this->driverPattern = $driverPattern; $this->namespaces = $namespaces; $this->enabledParameter = $enabledParameter; $this->fallbackManagerParameter = $fallbackManagerParameter; + if (count($aliasMap) && (!$configurationPattern || !$registerAliasMethodName)) { + throw new \InvalidArgumentException('configurationPattern and registerAliasMethodName are required to register namespace alias'); + } + $this->configurationPattern = $configurationPattern; + $this->registerAliasMethodName = $registerAliasMethodName; + $this->aliasMap = $aliasMap; } /** - * Register mappings with the metadata drivers. + * Register mappings and aliases with the metadata drivers. * * @param ContainerBuilder $container */ @@ -55,10 +64,22 @@ public function process(ContainerBuilder $container) } $chainDriverDefService = $this->getChainDriverServiceName($container); + // Definition for a Doctrine\Common\Persistence\Mapping\Driver\MappingDriverChain $chainDriverDef = $container->getDefinition($chainDriverDefService); foreach ($this->namespaces as $namespace) { $chainDriverDef->addMethodCall('addDriver', array($this->driver, $namespace)); } + + if (!count($this->aliasMap)) { + return; + } + + $configurationServiceName = $this->getConfigurationServiceName($container); + // Definition of the Doctrine\...\Configuration class specific to the Doctrine flavour. + $configurationServiceDefinition = $container->getDefinition($configurationServiceName); + foreach ($this->aliasMap as $alias => $namespace) { + $configurationServiceDefinition->addMethodCall($this->registerAliasMethodName, array($alias, $namespace)); + } } protected function getChainDriverServiceName(ContainerBuilder $container) @@ -75,30 +96,30 @@ protected function getChainDriverServiceName(ContainerBuilder $container) throw new ParameterNotFoundException('None of the managerParameters resulted in a valid name'); } - public static function createOrmMappingDriver(array $mappings) + public static function createOrmMappingDriver(array $mappings, array $aliasMap = array()) { $arguments = array($mappings, '.orm.xml'); $locator = new Definition('Doctrine\Common\Persistence\Mapping\Driver\SymfonyFileLocator', $arguments); $driver = new Definition('Doctrine\ORM\Mapping\Driver\XmlDriver', array($locator)); - return new RegisterMappingsPass($driver, 'doctrine.orm.%s_metadata_driver', $mappings, 'fos_user.backend_type_orm', 'doctrine.default_entity_manager'); + return new RegisterMappingsPass($driver, 'doctrine.orm.%s_metadata_driver', $mappings, 'fos_user.backend_type_orm', 'doctrine.default_entity_manager', 'doctrine.orm.%s_configuration', 'addEntityNamespace', $aliasMap); } - public static function createMongoDBMappingDriver($mappings) + public static function createMongoDBMappingDriver($mappings, array $aliasMap = array()) { $arguments = array($mappings, '.mongodb.xml'); $locator = new Definition('Doctrine\Common\Persistence\Mapping\Driver\SymfonyFileLocator', $arguments); $driver = new Definition('Doctrine\ODM\MongoDB\Mapping\Driver\XmlDriver', array($locator)); - return new RegisterMappingsPass($driver, 'doctrine_mongodb.odm.%s_metadata_driver', $mappings, 'fos_user.backend_type_mongodb', 'doctrine_mongodb.odm.default_document_manager'); + return new RegisterMappingsPass($driver, 'doctrine_mongodb.odm.%s_metadata_driver', $mappings, 'fos_user.backend_type_mongodb', 'doctrine_mongodb.odm.default_document_manager', 'doctrine_mongodb.odm.%s_configuration', 'addDocumentNamespace', $aliasMap); } - public static function createCouchDBMappingDriver($mappings) + public static function createCouchDBMappingDriver($mappings, array $aliasMap = array()) { $arguments = array($mappings, '.couchdb.xml'); $locator = new Definition('Doctrine\Common\Persistence\Mapping\Driver\SymfonyFileLocator', $arguments); $driver = new Definition('Doctrine\ODM\CouchDB\Mapping\Driver\XmlDriver', array($locator)); - return new RegisterMappingsPass($driver, 'doctrine_couchdb.odm.%s_metadata_driver', $mappings, 'fos_user.backend_type_couchdb', 'doctrine_couchdb.default_document_manager'); + return new RegisterMappingsPass($driver, 'doctrine_couchdb.odm.%s_metadata_driver', $mappings, 'fos_user.backend_type_couchdb', 'doctrine_couchdb.default_document_manager', 'doctrine_couchdb.odm.%s_configuration', 'addDocumentNamespace', $aliasMap); } } diff --git a/FOSUserBundle.php b/FOSUserBundle.php index 044dc672ab..2333b492e6 100644 --- a/FOSUserBundle.php +++ b/FOSUserBundle.php @@ -12,6 +12,7 @@ namespace FOS\UserBundle; use Symfony\Component\HttpKernel\Bundle\Bundle; +use Symfony\Component\HttpKernel\Kernel; use Symfony\Component\DependencyInjection\ContainerBuilder; use FOS\UserBundle\DependencyInjection\Compiler\ValidationPass; use FOS\UserBundle\DependencyInjection\Compiler\RegisterMappingsPass; @@ -38,29 +39,33 @@ public function build(ContainerBuilder $container) */ private function addRegisterMappingsPass(ContainerBuilder $container) { - // the base class is only available since symfony 2.3 - $symfonyVersion = class_exists('Symfony\Bridge\Doctrine\DependencyInjection\CompilerPass\RegisterMappingsPass'); + // alias support was added later + $symfonyVersion = version_compare(Kernel::VERSION, '2.6.0', '>='); - $mappings = array( + $namespaces = array( realpath(__DIR__ . '/Resources/config/doctrine/model') => 'FOS\UserBundle\Model', ); + $aliasMap = array( + 'FOS\UserBundle\Model' => 'FOSUserBundle', + ); + if ($symfonyVersion && class_exists('Doctrine\Bundle\DoctrineBundle\DependencyInjection\Compiler\DoctrineOrmMappingsPass')) { - $container->addCompilerPass(DoctrineOrmMappingsPass::createXmlMappingDriver($mappings, array('fos_user.model_manager_name'), 'fos_user.backend_type_orm')); + $container->addCompilerPass(DoctrineOrmMappingsPass::createXmlMappingDriver($namespaces, array('fos_user.model_manager_name'), 'fos_user.backend_type_orm', $aliasMap)); } else { - $container->addCompilerPass(RegisterMappingsPass::createOrmMappingDriver($mappings)); + $container->addCompilerPass(RegisterMappingsPass::createOrmMappingDriver($namespaces, $aliasMap)); } if ($symfonyVersion && class_exists('Doctrine\Bundle\MongoDBBundle\DependencyInjection\Compiler\DoctrineMongoDBMappingsPass')) { - $container->addCompilerPass(DoctrineMongoDBMappingsPass::createXmlMappingDriver($mappings, array('fos_user.model_manager_name'), 'fos_user.backend_type_mongodb')); + $container->addCompilerPass(DoctrineMongoDBMappingsPass::createXmlMappingDriver($namespaces, array('fos_user.model_manager_name'), 'fos_user.backend_type_mongodb', $aliasMap)); } else { - $container->addCompilerPass(RegisterMappingsPass::createMongoDBMappingDriver($mappings)); + $container->addCompilerPass(RegisterMappingsPass::createMongoDBMappingDriver($namespaces, $aliasMap)); } if ($symfonyVersion && class_exists('Doctrine\Bundle\CouchDBBundle\DependencyInjection\Compiler\DoctrineCouchDBMappingsPass')) { - $container->addCompilerPass(DoctrineCouchDBMappingsPass::createXmlMappingDriver($mappings, array('fos_user.model_manager_name'), 'fos_user.backend_type_couchdb')); + $container->addCompilerPass(DoctrineCouchDBMappingsPass::createXmlMappingDriver($namespaces, array('fos_user.model_manager_name'), 'fos_user.backend_type_couchdb', $aliasMap)); } else { - $container->addCompilerPass(RegisterMappingsPass::createCouchDBMappingDriver($mappings)); + $container->addCompilerPass(RegisterMappingsPass::createCouchDBMappingDriver($namespaces, $aliasMap)); } } }