[DoctrineBundle] Refactoring DoctrineBundle to match DoctrineMongoDBBundle

This commit is contained in:
Jonathan H. Wage 2010-07-23 18:42:26 -05:00 committed by Fabien Potencier
parent 2c1e85c3c0
commit ef070d0dd1
49 changed files with 1194 additions and 470 deletions

View File

@ -1,75 +0,0 @@
<?php
namespace Symfony\Bundle\DoctrineBundle\Controller;
use Symfony\Bundle\FrameworkBundle\Controller;
/*
* This file is part of the Symfony framework.
*
* (c) Fabien Potencier <fabien.potencier@symfony-project.com>
*
* This source file is subject to the MIT license that is bundled
* with this source code in the file LICENSE.
*/
/**
* Doctrine ORM controller gives you access to entity managers and DQL queries.
*
* @package Symfony
* @subpackage Bundle_DoctrineBundle
* @author Fabien Potencier <fabien.potencier@symfony-project.com>
* @author Jonathan H. Wage <jonwage@gmail.com>
*/
class DoctrineController extends Controller
{
public function getDatabaseConnection($name = null)
{
if ($name) {
return $this->container->get(sprintf('doctrine.dbal.%s_connection', $name));
} else {
return $this->container->getDatabaseConnectionService();
}
}
/**
* Get the default entity manager service or the entity manager
* with the given name.
*
* @param string $name Optional entity manager service name
*
* @return object
*/
protected function getEntityManager($name = null)
{
if ($name) {
return $this->container->get(sprintf('doctrine.orm.%s_entity_manager', $name));
} else {
return $this->container->getDoctrine_ORM_EntityManagerService();
}
}
/**
* Create a new QueryBuilder instance.
*
* @param string $name Optional entity manager service name
* @return object QueryBuilder
*/
public function createQueryBuilder($name = null)
{
return $this->getEntityManager($name)->createQueryBuilder();
}
/**
* Create a new Query instance.
*
* @param string $dql Optional Dql string to create the query from
* @param string $name Optional entity manager service name
*
* @return object QueryBuilder
*/
public function createQuery($dql = '', $name = null)
{
return $this->getEntityManager($name)->createQuery($dql);
}
}

View File

@ -7,6 +7,7 @@ use Symfony\Components\DependencyInjection\Loader\XmlFileLoader;
use Symfony\Components\DependencyInjection\ContainerBuilder;
use Symfony\Components\DependencyInjection\Definition;
use Symfony\Components\DependencyInjection\Reference;
use Symfony\Components\DependencyInjection\Resource\FileResource;
/*
* This file is part of the Symfony framework.
@ -22,6 +23,7 @@ use Symfony\Components\DependencyInjection\Reference;
*
* @package Symfony
* @subpackage Bundle_DoctrineBundle
* @author Jonathan H. Wage <jonwage@gmail.com>
* @author Fabien Potencier <fabien.potencier@symfony-project.com>
*/
class DoctrineExtension extends Extension
@ -30,7 +32,6 @@ class DoctrineExtension extends Extension
'dbal' => 'dbal.xml',
'orm' => 'orm.xml',
);
protected $alias;
protected $bundleDirs;
protected $bundles;
protected $kernelCacheDir;
@ -42,28 +43,131 @@ class DoctrineExtension extends Extension
$this->kernelCacheDir = $kernelCacheDir;
}
public function setAlias($alias)
{
$this->alias = $alias;
}
/**
* Loads the DBAL configuration.
*
* Usage example:
*
* <doctrine:dbal dbname="sfweb" user="root" />
* <doctrine:dbal id="myconn" dbname="sfweb" user="root" />
*
* @param array $config An array of configuration settings
* @param \Symfony\Components\DependencyInjection\ContainerBuilder $container A ContainerBuilder instance
* @param array $config An array of configuration settings
* @param ContainerBuilder $container A ContainerBuilder instance
*/
public function dbalLoad($config, ContainerBuilder $container)
{
$this->loadDbalDefaults($config, $container);
$this->loadDbalConnections($config, $container);
}
/**
* Loads the Doctrine ORM configuration.
*
* Usage example:
*
* <doctrine:orm id="mydm" connection="myconn" />
*
* @param array $config An array of configuration settings
* @param ContainerBuilder $container A ContainerBuilder instance
*/
public function ormLoad($config, ContainerBuilder $container)
{
$this->createOrmProxyDirectory();
$this->loadOrmDefaults($config, $container);
$this->loadOrmEntityManagers($config, $container);
}
/**
* Loads the DBAL configuration defaults.
*
* @param array $config An array of configuration settings
* @param ContainerBuilder $container A ContainerBuilder instance
*/
protected function loadDbalDefaults(array $config, ContainerBuilder $container)
{
if (!$container->hasDefinition('doctrine.dbal.logger')) {
$loader = new XmlFileLoader($container, __DIR__.'/../Resources/config');
$loader->load($this->resources['dbal']);
}
$defaultConnectionName = isset($config['default_connection']) ? $config['default_connection'] : $container->getParameter('doctrine.dbal.default_connection');
$container->setAlias('database_connection', sprintf('doctrine.dbal.%s_connection', $defaultConnectionName));
$container->setParameter('doctrine.dbal.default_connection', $defaultConnectionName);
}
/**
* Loads the configured DBAL connections.
*
* @param array $config An array of configuration settings
* @param ContainerBuilder $container A ContainerBuilder instance
*/
protected function loadDbalConnections(array $config, ContainerBuilder $container)
{
$connections = $this->getDbalConnections($config, $container);
foreach ($connections as $name => $connection) {
$connection['name'] = $name;
$this->loadDbalConnection($connection, $container);
}
}
/**
* Loads a configured DBAL connection.
*
* @param array $connection A dbal connection configuration.
* @param ContainerBuilder $container A ContainerBuilder instance
*/
protected function loadDbalConnection(array $connection, ContainerBuilder $container)
{
// previously registered?
if ($container->hasDefinition(sprintf('doctrine.dbal.%s_connection', $connection['name']))) {
$driverDef = $container->getDefinition(sprintf('doctrine.dbal.%s_connection', $connection['name']));
$arguments = $driverDef->getArguments();
$driverOptions = $arguments[0];
} else {
$containerClass = isset($connection['configuration_class']) ? $connection['configuration_class'] : 'Doctrine\DBAL\Configuration';
$containerDef = new Definition($containerClass);
$containerDef->addMethodCall('setSqlLogger', array(new Reference('doctrine.dbal.logger')));
$container->setDefinition(sprintf('doctrine.dbal.%s_connection.configuration', $connection['name']), $containerDef);
$eventManagerDef = new Definition($connection['event_manager_class']);
$container->setDefinition(sprintf('doctrine.dbal.%s_connection.event_manager', $connection['name']), $eventManagerDef);
$driverOptions = array();
$driverDef = new Definition('Doctrine\DBAL\DriverManager');
$driverDef->setFactoryMethod('getConnection');
$container->setDefinition(sprintf('doctrine.dbal.%s_connection', $connection['name']), $driverDef);
}
if (isset($connection['driver'])) {
$driverOptions['driverClass'] = sprintf('Doctrine\\DBAL\\Driver\\%s\\Driver', $connection['driver']);
}
if (isset($connection['wrapper_class'])) {
$driverOptions['wrapperClass'] = $connection['wrapper_class'];
}
if (isset($connection['options'])) {
$driverOptions['driverOptions'] = $connection['options'];
}
foreach (array('dbname', 'host', 'user', 'password', 'path', 'memory', 'port', 'unix_socket', 'charset') as $key) {
if (isset($connection[$key])) {
$driverOptions[$key] = $connection[$key];
}
}
$driverDef->setArguments(array(
$driverOptions,
new Reference(sprintf('doctrine.dbal.%s_connection.configuration', $connection['name'])),
new Reference(sprintf('doctrine.dbal.%s_connection.event_manager', $connection['name']))
));
}
/**
* Gets the configured DBAL connections.
*
* @param array $config An array of configuration settings
* @param ContainerBuilder $container A ContainerBuilder instance
*/
protected function getDbalConnections(array $config, ContainerBuilder $container)
{
$defaultConnectionName = $container->getParameter('doctrine.dbal.default_connection');
$defaultConnection = array(
'driver' => 'PDOMySql',
'user' => 'root',
@ -75,217 +179,315 @@ class DoctrineExtension extends Extension
'wrapper_class' => null,
'options' => array()
);
$defaultConnectionName = isset($config['default_connection']) ? $config['default_connection'] : $container->getParameter('doctrine.dbal.default_connection');
$container->setAlias('database_connection', null !== $this->alias ? $this->alias : sprintf('doctrine.dbal.%s_connection', $defaultConnectionName));
$container->setParameter('doctrine.dbal.default_connection', $defaultConnectionName);
$connections = array();
if (isset($config['connections'])) {
$config_connections = $config['connections'];
$configConnections = $config['connections'];
if(isset($config['connections']['connection']) && isset($config['connections']['connection'][0])) {
// Multiple connections
$config_connections = $config['connections']['connection'];
$configConnections = $config['connections']['connection'];
}
foreach ($config_connections as $name => $connection) {
$connections[isset($connection['id']) ? $connection['id'] : $name] = $connection;
foreach ($configConnections as $name => $connection) {
$connections[isset($connection['id']) ? $connection['id'] : $name] = array_merge($defaultConnection, $connection);
}
} else {
$connections = array($defaultConnectionName => $config);
$connections = array($defaultConnectionName => array_merge($defaultConnection, $config));
}
return $connections;
}
foreach ($connections as $name => $connection) {
// previously registered?
if ($container->hasDefinition(sprintf('doctrine.dbal.%s_connection', $name))) {
$driverDef = $container->getDefinition(sprintf('doctrine.dbal.%s_connection', $name));
$arguments = $driverDef->getArguments();
$driverOptions = $arguments[0];
} else {
$connection = array_merge($defaultConnection, $connection);
$containerClass = isset($connection['configuration_class']) ? $connection['configuration_class'] : 'Doctrine\DBAL\Configuration';
$containerDef = new Definition($containerClass);
$containerDef->addMethodCall('setSqlLogger', array(new Reference('doctrine.dbal.logger')));
$container->setDefinition(sprintf('doctrine.dbal.%s_connection.configuration', $name), $containerDef);
$eventManagerDef = new Definition($connection['event_manager_class']);
$container->setDefinition(sprintf('doctrine.dbal.%s_connection.event_manager', $name), $eventManagerDef);
$driverOptions = array();
$driverDef = new Definition('Doctrine\DBAL\DriverManager');
$driverDef->setFactoryMethod('getConnection');
$container->setDefinition(sprintf('doctrine.dbal.%s_connection', $name), $driverDef);
/**
* Create the Doctrine ORM Entity proxy directory
*/
protected function createOrmProxyDirectory()
{
// Create entity proxy directory
$proxyCacheDir = $this->kernelCacheDir . '/doctrine/orm/Proxies';
if (!is_dir($proxyCacheDir)) {
if (false === @mkdir($proxyCacheDir, 0777, true)) {
die(sprintf('Unable to create the Doctrine Proxy directory (%s)', dirname($proxyCacheDir)));
}
if (isset($connection['driver'])) {
$driverOptions['driverClass'] = sprintf('Doctrine\\DBAL\\Driver\\%s\\Driver', $connection['driver']);
}
if (isset($connection['wrapper_class'])) {
$driverOptions['wrapperClass'] = $connection['wrapper_class'];
}
if (isset($connection['options'])) {
$driverOptions['driverOptions'] = $connection['options'];
}
foreach (array('dbname', 'host', 'user', 'password', 'path', 'memory', 'port', 'unix_socket', 'charset') as $key) {
if (isset($connection[$key])) {
$driverOptions[$key] = $connection[$key];
}
}
$driverDef->setArguments(array(
$driverOptions,
new Reference(sprintf('doctrine.dbal.%s_connection.configuration', $name)),
new Reference(sprintf('doctrine.dbal.%s_connection.event_manager', $name))
));
} elseif (!is_writable($proxyCacheDir)) {
die(sprintf('Unable to write in the Doctrine Proxy directory (%s)', $proxyCacheDir));
}
}
/**
* Loads the Doctrine ORM configuration.
* Loads the ORM default configuration.
*
* @param array $config An array of configuration settings
* @param \Symfony\Components\DependencyInjection\ContainerBuilder $container A ContainerBuilder instance
* @param array $config An array of configuration settings
* @param ContainerBuilder $container A ContainerBuilder instance
*/
public function ormLoad($config, ContainerBuilder $container)
protected function loadOrmDefaults(array $config, ContainerBuilder $container)
{
$loader = new XmlFileLoader($container, __DIR__.'/../Resources/config');
$loader->load($this->resources['orm']);
if (isset($config['default_entity_manager'])) {
$container->getParameter('doctrine.orm.default_entity_manager', $config['default_entity_manager']);
}
$defaultEntityManager = $container->getParameter('doctrine.orm.default_entity_manager');
foreach (array('metadata_driver', 'cache_driver') as $key) {
// Allow these application configuration options to override the defaults
$options = array(
'default_entity_manager',
'default_connection',
'metadata_cache_driver',
'query_cache_driver',
'result_cache_driver',
'proxy_namespace',
'auto_generate_proxy_classes'
);
foreach ($options as $key) {
if (isset($config[$key])) {
$container->setParameter('doctrine.orm.'.$key, $config[$key]);
}
}
$config['entity_managers'] = isset($config['entity_managers']) ? $config['entity_managers'] : array($defaultEntityManager => array());
foreach ($config['entity_managers'] as $name => $connection) {
$ormConfigDef = new Definition('Doctrine\ORM\Configuration');
$container->setDefinition(sprintf('doctrine.orm.%s_configuration', $name), $ormConfigDef);
$drivers = array('metadata', 'query', 'result');
foreach ($drivers as $driver) {
$definition = $container->getDefinition(sprintf('doctrine.orm.cache.%s', $container->getParameter('doctrine.orm.cache_driver')));
$clone = clone $definition;
$clone->addMethodCall('setNamespace', array(sprintf('doctrine_%s_', $driver)));
$container->setDefinition(sprintf('doctrine.orm.%s_cache', $driver), $clone);
}
// configure metadata driver for each bundle based on the type of mapping files found
$mappingDriverDef = new Definition('Doctrine\ORM\Mapping\Driver\DriverChain');
$bundleEntityMappings = array();
$bundleDirs = $this->bundleDirs;
$aliasMap = array();
foreach ($this->bundles as $className) {
$tmp = dirname(str_replace('\\', '/', $className));
$namespace = str_replace('/', '\\', dirname($tmp));
$class = basename($tmp);
if (!isset($bundleDirs[$namespace])) {
continue;
}
$type = false;
if (is_dir($dir = $bundleDirs[$namespace].'/'.$class.'/Resources/config/doctrine/metadata')) {
$type = $this->detectMappingType($dir);
}
if (is_dir($dir = $bundleDirs[$namespace].'/'.$class.'/Entities')) {
if ($type === false) {
$type = 'annotation';
}
$aliasMap[$class] = $namespace.'\\'.$class.'\\Entities';
}
if (false !== $type) {
$mappingDriverDef->addMethodCall('addDriver', array(
new Reference(sprintf('doctrine.orm.metadata_driver.%s', $type)),
$namespace.'\\'.$class.'\\Entities'
)
);
}
}
$ormConfigDef->addMethodCall('setEntityNamespaces', array($aliasMap));
$container->setDefinition('doctrine.orm.metadata_driver', $mappingDriverDef);
$proxyCacheDir = $this->kernelCacheDir . '/doctrine/orm/Proxies';
if (!is_dir($proxyCacheDir)) {
if (false === @mkdir($proxyCacheDir, 0777, true)) {
die(sprintf('Unable to create the Doctrine Proxy directory (%s)', dirname($proxyCacheDir)));
}
} elseif (!is_writable($proxyCacheDir)) {
die(sprintf('Unable to write in the Doctrine Proxy directory (%s)', $proxyCacheDir));
}
$methods = array(
'setMetadataCacheImpl' => new Reference('doctrine.orm.metadata_cache'),
'setQueryCacheImpl' => new Reference('doctrine.orm.query_cache'),
'setResultCacheImpl' => new Reference('doctrine.orm.result_cache'),
'setMetadataDriverImpl' => new Reference('doctrine.orm.metadata_driver'),
'setProxyDir' => $proxyCacheDir,
'setProxyNamespace' => 'Proxies',
'setAutoGenerateProxyClasses' => true
);
foreach ($methods as $method => $arg) {
$ormConfigDef->addMethodCall($method, array($arg));
}
$ormEmArgs = array(
new Reference(
sprintf('doctrine.dbal.%s_connection',
isset($connection['connection']) ? $connection['connection'] : $name)
),
new Reference(sprintf('doctrine.orm.%s_configuration', $name))
);
$ormEmDef = new Definition('Doctrine\ORM\EntityManager', $ormEmArgs);
$ormEmDef->setFactoryMethod('create');
$container->setDefinition(
sprintf('doctrine.orm.%s_entity_manager', $name),
$ormEmDef
);
if ($name == $defaultEntityManager) {
$container->setAlias(
'doctrine.orm.entity_manager',
sprintf('doctrine.orm.%s_entity_manager', $name)
);
}
}
$container->setAlias(
'doctrine.orm.cache',
sprintf(
'doctrine.orm.cache.%s',
$container->getParameter('doctrine.orm.cache_driver')
)
);
$container->setParameter('doctrine.orm.mapping_dirs', $this->findBundleSubpaths('Resources/config/doctrine/metadata', $container));
$container->setParameter('doctrine.orm.entity_dirs', $this->findBundleSubpaths('Entity', $container));
}
/**
* Detect the type of Doctrine 2 mapping files located in a given directory.
* Simply finds the first file in a directory and returns the extension. If no
* mapping files are found then the annotation type is returned.
* Loads the configured ORM entity managers.
*
* @param string $dir
*
* @return string
* @param array $config An array of configuration settings
* @param ContainerBuilder $container A ContainerBuilder instance
*/
protected function detectMappingType($dir)
protected function loadOrmEntityManagers(array $config, ContainerBuilder $container)
{
$files = glob($dir.'/*.*');
if (!$files) {
$entityManagers = $this->getOrmEntityManagers($config, $container);
foreach ($entityManagers as $name => $entityManager) {
$entityManager['name'] = $name;
$this->loadOrmEntityManager($entityManager, $container);
}
}
/**
* Loads a configured ORM entity manager.
*
* @param array $entityManager A configured ORM entity manager.
* @param ContainerBuilder $container A ContainerBuilder instance
*/
protected function loadOrmEntityManager(array $entityManager, ContainerBuilder $container)
{
$defaultEntityManager = $container->getParameter('doctrine.orm.default_entity_manager');
$proxyCacheDir = $this->kernelCacheDir . '/doctrine/orm/Proxies';
$ormConfigDef = new Definition('Doctrine\ORM\Configuration');
$container->setDefinition(sprintf('doctrine.orm.%s_configuration', $entityManager['name']), $ormConfigDef);
$this->loadOrmEntityManagerBundlesMappingInformation($entityManager, $ormConfigDef, $container);
$this->loadOrmCacheDrivers($entityManager, $container);
$methods = array(
'setMetadataCacheImpl' => new Reference('doctrine.orm.metadata_cache'),
'setQueryCacheImpl' => new Reference('doctrine.orm.query_cache'),
'setResultCacheImpl' => new Reference('doctrine.orm.result_cache'),
'setMetadataDriverImpl' => new Reference('doctrine.orm.metadata_driver'),
'setProxyDir' => $proxyCacheDir,
'setProxyNamespace' => $container->getParameter('doctrine.orm.proxy_namespace'),
'setAutoGenerateProxyClasses' => $container->getParameter('doctrine.orm.auto_generate_proxy_classes')
);
foreach ($methods as $method => $arg) {
$ormConfigDef->addMethodCall($method, array($arg));
}
$ormEmArgs = array(
new Reference(sprintf('doctrine.dbal.%s_connection', isset($entityManager['connection']) ? $entityManager['connection'] : $entityManager['name'])),
new Reference(sprintf('doctrine.orm.%s_configuration', $entityManager['name']))
);
$ormEmDef = new Definition('%doctrine.orm.entity_manager_class%', $ormEmArgs);
$ormEmDef->setFactoryMethod('create');
$container->setDefinition(sprintf('doctrine.orm.%s_entity_manager', $entityManager['name']), $ormEmDef);
if ($entityManager['name'] == $defaultEntityManager) {
$container->setAlias(
'doctrine.orm.entity_manager',
sprintf('doctrine.orm.%s_entity_manager', $entityManager['name'])
);
}
}
/**
* Gets the configured entity managers.
*
* @param array $config An array of configuration settings
* @param ContainerBuilder $container A ContainerBuilder instance
*/
protected function getOrmEntityManagers(array $config, ContainerBuilder $container)
{
$defaultEntityManager = $container->getParameter('doctrine.orm.default_entity_manager');
$entityManagers = array();
if (isset($config['entity_managers'])) {
$configEntityManagers = $config['entity_managers'];
if (isset($config['entity_managers']['entity_manager']) && isset($config['entity_managers']['entity_manager'][0])) {
// Multiple entity managers
$configEntityManagers = $config['entity_managers']['entity_manager'];
}
foreach ($configEntityManagers as $name => $entityManager) {
$entityManagers[isset($entityManager['id']) ? $entityManager['id'] : $name] = $entityManager;
}
} else {
$entityManagers = array($defaultEntityManager => $config);
}
return $entityManagers;
}
/**
* Loads an ORM entity managers bundle mapping information.
*
* @param array $entityManager A configured ORM entity manager.
* @param ContainerBuilder $container A ContainerBuilder instance
*/
protected function loadOrmEntityManagerBundlesMappingInformation(array $entityManager, Definition $ormConfigDef, ContainerBuilder $container)
{
// configure metadata driver for each bundle based on the type of mapping files found
$mappingDriverDef = new Definition('%doctrine.orm.metadata.driver_chain_class%');
$bundleEntityMappings = array();
$bundleDirs = $this->bundleDirs;
$aliasMap = array();
foreach ($this->bundles as $className) {
$tmp = dirname(str_replace('\\', '/', $className));
$namespace = str_replace('/', '\\', dirname($tmp));
$class = basename($tmp);
if (!isset($bundleDirs[$namespace])) {
continue;
}
$type = $this->detectMetadataDriver($bundleDirs[$namespace].'/'.$class, $container);
if (is_dir($dir = $bundleDirs[$namespace].'/'.$class.'/Entity')) {
if ($type === null) {
$type = 'annotation';
}
$aliasMap[$class] = $namespace.'\\'.$class.'\\Entity';
}
if ($type !== null) {
$mappingDriverDef->addMethodCall('addDriver', array(
new Reference(sprintf('doctrine.orm.metadata_driver.%s', $type)),
$namespace.'\\'.$class.'\\Entity'
)
);
}
}
$ormConfigDef->addMethodCall('setEntityNamespaces', array($aliasMap));
$container->setDefinition('doctrine.orm.metadata_driver', $mappingDriverDef);
}
/**
* Loads a configured entity managers cache drivers.
*
* @param array $entityManager A configured ORM entity manager.
* @param ContainerBuilder $container A ContainerBuilder instance
*/
protected function loadOrmCacheDrivers(array $entityManager, ContainerBuilder $container)
{
$this->loadOrmEntityManagerMetadataCacheDriver($entityManager, $container);
$this->loadOrmEntityManagerQueryCacheDriver($entityManager, $container);
$this->loadOrmEntityManagerResultCacheDriver($entityManager, $container);
}
/**
* Loads a configured entity managers metadata cache driver.
*
* @param array $entityManager A configured ORM entity manager.
* @param ContainerBuilder $container A ContainerBuilder instance
*/
protected function loadOrmEntityManagerMetadataCacheDriver(array $entityManager, ContainerBuilder $container)
{
$metadataCacheDriver = $container->getParameter('doctrine.orm.metadata_cache_driver');
$emMetadataCacheDriver = isset($entityManager['metadata_cache_driver']) ? $entityManager['metadata_cache_driver'] : $metadataCacheDriver;
$type = is_array($emMetadataCacheDriver) && isset($emMetadataCacheDriver['type']) ? $emMetadataCacheDriver['type'] : $emMetadataCacheDriver;
if ($type === 'memcache') {
$memcacheClass = isset($emMetadataCacheDriver['class']) ? $emMetadataCacheDriver['class'] : '%'.sprintf('doctrine.orm.cache.%s_class', $type).'%';
$cacheDef = new Definition($memcacheClass);
$memcacheHost = isset($emMetadataCacheDriver['host']) ? $emMetadataCacheDriver['host'] : '%doctrine.orm.cache.memcache_host%';
$memcachePort = isset($emMetadataCacheDriver['port']) ? $emMetadataCacheDriver['port'] : '%doctrine.orm.cache.memcache_port%';
$memcacheInstanceClass = isset($emMetadataCacheDriver['instance_class']) ? $emMetadataCacheDriver['instance_class'] : '%doctrine.orm.cache.memcache_instance_class%';
$memcacheInstance = new Definition($memcacheInstanceClass);
$memcacheInstance->addMethodCall('connect', array($memcacheHost, $memcachePort));
$container->setDefinition(sprintf('doctrine.orm.%s_memcache_instance', $entityManager['name']), $memcacheInstance);
$cacheDef->addMethodCall('setMemcache', array(new Reference(sprintf('doctrine.orm.%s_memcache_instance', $entityManager['name']))));
} else {
$cacheDef = new Definition('%'.sprintf('doctrine.orm.cache.%s_class', $type).'%');
}
$container->setDefinition(sprintf('doctrine.orm.%s_metadata_cache', $entityManager['name']), $cacheDef);
}
/**
* Loads a configured entity managers query cache driver.
*
* @param array $entityManager A configured ORM entity manager.
* @param ContainerBuilder $container A ContainerBuilder instance
*/
protected function loadOrmEntityManagerQueryCacheDriver(array $entityManager, ContainerBuilder $container)
{
}
/**
* Loads a configured entity managers result cache driver.
*
* @param array $entityManager A configured ORM entity manager.
* @param ContainerBuilder $container A ContainerBuilder instance
*/
protected function loadOrmEntityManagerResultCacheDriver(array $entityManager, ContainerBuilder $container)
{
}
/**
* Finds existing bundle subpaths.
*
* @param string $path A subpath to check for
* @param ContainerBuilder $container A ContainerBuilder configuration
*
* @return array An array of absolute directory paths
*/
protected function findBundleSubpaths($path, ContainerBuilder $container)
{
$dirs = array();
foreach ($this->bundles as $bundle) {
$reflection = new \ReflectionClass($bundle);
if (is_dir($dir = dirname($reflection->getFilename()).'/'.$path)) {
$dirs[] = $dir;
$container->addResource(new FileResource($dir));
} else {
// add the closest existing parent directory as a file resource
do {
$dir = dirname($dir);
} while (!is_dir($dir));
$container->addResource(new FileResource($dir));
}
}
return $dirs;
}
/**
* Detects what metadata driver to use for the supplied directory.
*
* @param string $dir A directory path
* @param ContainerBuilder $container A ContainerBuilder configuration
*
* @return string|null A metadata driver short name, if one can be detected
*/
static protected function detectMetadataDriver($dir, ContainerBuilder $container)
{
// add the closest existing directory as a resource
$resource = $dir.'/Resources/config/doctrine/metadata';
while (!is_dir($resource)) {
$resource = dirname($resource);
}
$container->addResource(new FileResource($resource));
if (count(glob($dir.'/Resources/config/doctrine/metadata/*.xml'))) {
return 'xml';
} elseif (count(glob($dir.'/Resources/config/doctrine/metadata/*.yml'))) {
return 'yml';
}
// add the directory itself as a resource
$container->addResource(new FileResource($dir));
if (is_dir($dir.'/Entity')) {
return 'annotation';
}
$info = pathinfo($files[0]);
return $info['extension'];
}
/**
@ -319,4 +521,4 @@ class DoctrineExtension extends Extension
{
return 'doctrine';
}
}
}

View File

@ -37,29 +37,10 @@ class DoctrineBundle extends Bundle
*/
public function buildContainer(ParameterBagInterface $parameterBag)
{
ContainerBuilder::registerExtension(new DoctrineExtension(
ContainerBuilder::registerExtension(new DoctrineExtension(
$parameterBag->get('kernel.bundle_dirs'),
$parameterBag->get('kernel.bundles'),
$parameterBag->get('kernel.cache_dir')
));
$metadataDirs = array();
$entityDirs = array();
$bundleDirs = $parameterBag->get('kernel.bundle_dirs');
foreach ($parameterBag->get('kernel.bundles') as $className) {
$tmp = dirname(str_replace('\\', '/', $className));
$namespace = str_replace('/', '\\', dirname($tmp));
$class = basename($tmp);
if (isset($bundleDirs[$namespace])) {
if (is_dir($dir = $bundleDirs[$namespace].'/'.$class.'/Resources/config/doctrine/metadata')) {
$metadataDirs[] = realpath($dir);
}
if (is_dir($dir = $bundleDirs[$namespace].'/'.$class.'/Entities')) {
$entityDirs[] = realpath($dir);
}
}
}
$parameterBag->set('doctrine.orm.metadata_driver.mapping_dirs', $metadataDirs);
$parameterBag->set('doctrine.orm.entity_dirs', $entityDirs);
}
}

View File

@ -5,6 +5,9 @@
xsi:schemaLocation="http://www.symfony-project.org/schema/dic/services http://www.symfony-project.org/schema/dic/services/services-1.0.xsd">
<parameters>
<parameter key="doctrine.dbal.default_connection">default</parameter>
<parameter key="doctrine.dbal.connection_class">Doctrine\DBAL\Connection</parameter>
<parameter key="doctrine.data_collector.class">Symfony\Bundle\DoctrineBundle\DataCollector\DoctrineDataCollector</parameter>
<parameter key="doctrine.dbal.default_connection">default</parameter>
</parameters>

View File

@ -5,10 +5,39 @@
xsi:schemaLocation="http://www.symfony-project.org/schema/dic/services http://www.symfony-project.org/schema/dic/services/services-1.0.xsd">
<parameters>
<parameter key="doctrine.orm.cache_driver">array</parameter>
<parameter key="doctrine.orm.cache.memcache.host">localhost</parameter>
<parameter key="doctrine.orm.cache.memcache.port">11211</parameter>
<parameter key="doctrine.orm.default_entity_manager">default</parameter>
<parameter key="doctrine.orm.metadata_cache_driver">array</parameter>
<parameter key="doctrine.orm.query_cache_driver">array</parameter>
<parameter key="doctrine.orm.result_cache_driver">array</parameter>
<parameter key="doctrine.orm.configuration_class">Doctrine\ORM\Configuration</parameter>
<parameter key="doctrine.orm.entity_manager_class">Doctrine\ORM\EntityManager</parameter>
<!-- proxies -->
<parameter key="doctrine.orm.proxy_namespace">Proxies</parameter>
<parameter key="doctrine.orm.auto_generate_proxy_classes">false</parameter>
<!-- cache -->
<parameter key="doctrine.orm.cache.array_class">Doctrine\Common\Cache\ArrayCache</parameter>
<parameter key="doctrine.orm.cache.apc_class">Doctrine\Common\Cache\ApcCache</parameter>
<parameter key="doctrine.orm.cache.memcache_class">Doctrine\Common\Cache\MemcacheCache</parameter>
<parameter key="doctrine.orm.cache.memcache_host">localhost</parameter>
<parameter key="doctrine.orm.cache.memcache_port">11211</parameter>
<parameter key="doctrine.orm.cache.memcache_instance_class">Memcache</parameter>
<parameter key="doctrine.orm.cache.xcache_class">Doctrine\Common\Cache\XcacheCache</parameter>
<!-- metadata -->
<parameter key="doctrine.orm.metadata.driver_chain_class">Doctrine\ORM\Mapping\Driver\DriverChain</parameter>
<parameter key="doctrine.orm.metadata.annotation_class">Doctrine\ORM\Mapping\Driver\AnnotationDriver</parameter>
<parameter key="doctrine.orm.metadata.annotation_reader_class">Doctrine\Common\Annotations\AnnotationReader</parameter>
<parameter key="doctrine.orm.metadata.annotation_default_namespace">Doctrine\ORM\Mapping\</parameter>
<parameter key="doctrine.orm.metadata.xml_class">Doctrine\ORM\Mapping\Driver\XmlDriver</parameter>
<parameter key="doctrine.orm.metadata.yml_class">Doctrine\ORM\Mapping\Driver\YamlDriver</parameter>
<!-- directories -->
<parameter key="doctrine.orm.mapping_dirs" type="collection"></parameter>
<parameter key="doctrine.orm.xml_mapping_dirs">%doctrine.orm.mapping_dirs%</parameter>
<parameter key="doctrine.orm.yml_mapping_dirs">%doctrine.orm.mapping_dirs%</parameter>
<parameter key="doctrine.orm.entity_dirs" type="collection"></parameter>
</parameters>
<services>

View File

@ -0,0 +1,412 @@
<?php
/*
* This file is part of the Symfony package.
*
* (c) Fabien Potencier <fabien.potencier@symfony-project.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Symfony\Bundle\DoctrineBundle\Tests\DependencyInjection;
use Symfony\Bundle\DoctrineBundle\Tests\TestCase;
use Symfony\Bundle\DoctrineBundle\DependencyInjection\DoctrineExtension;
use Symfony\Components\DependencyInjection\ContainerBuilder;
use Symfony\Components\DependencyInjection\Loader\XmlFileLoader;
use Symfony\Components\DependencyInjection\Loader\YamlFileLoader;
abstract class AbstractDoctrineExtensionTest extends TestCase
{
abstract protected function loadFromFile(ContainerBuilder $container, $file);
public function testDbalLoad()
{
$container = new ContainerBuilder();
$loader = $this->getDoctrineExtensionLoader();
$loader->dbalLoad(array(), $container);
$this->assertEquals('Symfony\\Bundle\\DoctrineBundle\\DataCollector\\DoctrineDataCollector', $container->getParameter('doctrine.data_collector.class'), '->dbalLoad() loads the dbal.xml file if not already loaded');
// doctrine.dbal.default_connection
$this->assertEquals('default', $container->getParameter('doctrine.dbal.default_connection'), '->dbalLoad() overrides existing configuration options');
$loader->dbalLoad(array('default_connection' => 'foo'), $container);
$this->assertEquals('foo', $container->getParameter('doctrine.dbal.default_connection'), '->dbalLoad() overrides existing configuration options');
$loader->dbalLoad(array(), $container);
$this->assertEquals('foo', $container->getParameter('doctrine.dbal.default_connection'), '->dbalLoad() overrides existing configuration options');
$container = new ContainerBuilder();
$loader = $this->getDoctrineExtensionLoader();
$loader->dbalLoad(array('password' => 'foo'), $container);
$arguments = $container->getDefinition('doctrine.dbal.default_connection')->getArguments();
$config = $arguments[0];
$this->assertEquals('foo', $config['password']);
$this->assertEquals('root', $config['user']);
$loader->dbalLoad(array('user' => 'foo'), $container);
$this->assertEquals('foo', $config['password']);
$this->assertEquals('root', $config['user']);
}
public function testDbalLoadFromXmlMultipleConnections()
{
$container = new ContainerBuilder();
$loader = $this->getDoctrineExtensionLoader();
$container->registerExtension($loader);
$loadXml = new XmlFileLoader($container, __DIR__.'/Fixtures/config/xml');
$loadXml->load('dbal_service_multiple_connections.xml');
$loader->dbalLoad(array(), $container);
$container->freeze();
// doctrine.dbal.mysql_connection
$arguments = $container->getDefinition('doctrine.dbal.mysql_connection')->getArguments();
$config = $arguments[0];
$this->assertEquals('mysql_s3cr3t', $config['password']);
$this->assertEquals('mysql_user', $config['user']);
$this->assertEquals('mysql_db', $config['dbname']);
$this->assertEquals('/path/to/mysqld.sock', $config['unix_socket']);
// doctrine.dbal.sqlite_connection
$arguments = $container->getDefinition('doctrine.dbal.sqlite_connection')->getArguments();
$container = new ContainerBuilder();
$loader = $this->getDoctrineExtensionLoader();
$container->registerExtension($loader);
$loadXml = new XmlFileLoader($container, __DIR__.'/Fixtures/config/xml');
$loadXml->load('dbal_service_single_connection.xml');
$loader->dbalLoad(array(), $container);
$container->freeze();
// doctrine.dbal.mysql_connection
$arguments = $container->getDefinition('doctrine.dbal.mysql_connection')->getArguments();
$config = $arguments[0];
$this->assertEquals('mysql_s3cr3t', $config['password']);
$this->assertEquals('mysql_user', $config['user']);
$this->assertEquals('mysql_db', $config['dbname']);
$this->assertEquals('/path/to/mysqld.sock', $config['unix_socket']);
}
public function testDependencyInjectionConfigurationDefaults()
{
$container = new ContainerBuilder();
$loader = $this->getDoctrineExtensionLoader();
$loader->dbalLoad(array(), $container);
$loader->ormLoad(array(), $container);
$this->assertEquals('Doctrine\DBAL\Connection', $container->getParameter('doctrine.dbal.connection_class'));
$this->assertEquals('Doctrine\ORM\Configuration', $container->getParameter('doctrine.orm.configuration_class'));
$this->assertEquals('Doctrine\ORM\EntityManager', $container->getParameter('doctrine.orm.entity_manager_class'));
$this->assertEquals('Proxies', $container->getParameter('doctrine.orm.proxy_namespace'));
$this->assertEquals(false, $container->getParameter('doctrine.orm.auto_generate_proxy_classes'));
$this->assertEquals('Doctrine\Common\Cache\ArrayCache', $container->getParameter('doctrine.orm.cache.array_class'));
$this->assertEquals('Doctrine\Common\Cache\ApcCache', $container->getParameter('doctrine.orm.cache.apc_class'));
$this->assertEquals('Doctrine\Common\Cache\MemcacheCache', $container->getParameter('doctrine.orm.cache.memcache_class'));
$this->assertEquals('localhost', $container->getParameter('doctrine.orm.cache.memcache_host'));
$this->assertEquals('11211', $container->getParameter('doctrine.orm.cache.memcache_port'));
$this->assertEquals('Memcache', $container->getParameter('doctrine.orm.cache.memcache_instance_class'));
$this->assertEquals('Doctrine\Common\Cache\XcacheCache', $container->getParameter('doctrine.orm.cache.xcache_class'));
$this->assertEquals('Doctrine\ORM\Mapping\Driver\DriverChain', $container->getParameter('doctrine.orm.metadata.driver_chain_class'));
$this->assertEquals('Doctrine\ORM\Mapping\Driver\AnnotationDriver', $container->getParameter('doctrine.orm.metadata.annotation_class'));
$this->assertEquals('Doctrine\Common\Annotations\AnnotationReader', $container->getParameter('doctrine.orm.metadata.annotation_reader_class'));
$this->assertEquals('Doctrine\ORM\Mapping\\', $container->getParameter('doctrine.orm.metadata.annotation_default_namespace'));
$this->assertEquals('Doctrine\ORM\Mapping\Driver\XmlDriver', $container->getParameter('doctrine.orm.metadata.xml_class'));
$this->assertEquals('Doctrine\ORM\Mapping\Driver\YamlDriver', $container->getParameter('doctrine.orm.metadata.yml_class'));
$config = array(
'proxy_namespace' => 'MyProxies',
'auto_generate_proxy_classes' => true,
);
$loader->dbalLoad(array(), $container);
$loader->ormLoad($config, $container);
$this->assertEquals('MyProxies', $container->getParameter('doctrine.orm.proxy_namespace'));
$this->assertEquals(true, $container->getParameter('doctrine.orm.auto_generate_proxy_classes'));
$definition = $container->getDefinition('doctrine.dbal.default_connection');
$this->assertEquals('Doctrine\DBAL\DriverManager', $definition->getClass());
$args = $definition->getArguments();
$this->assertEquals('Doctrine\DBAL\Driver\PDOMySql\Driver', $args[0]['driverClass']);
$this->assertEquals('localhost', $args[0]['host']);
$this->assertEquals('root', $args[0]['user']);
$this->assertEquals('doctrine.dbal.default_connection.configuration', (string) $args[1]);
$this->assertEquals('doctrine.dbal.default_connection.event_manager', (string) $args[2]);
$definition = $container->getDefinition('doctrine.orm.default_entity_manager');
$this->assertEquals('%doctrine.orm.entity_manager_class%', $definition->getClass());
$this->assertEquals('create', $definition->getFactoryMethod());
$arguments = $definition->getArguments();
$this->assertInstanceOf('Symfony\Components\DependencyInjection\Reference', $arguments[0]);
$this->assertEquals('doctrine.dbal.default_connection', (string) $arguments[0]);
$this->assertInstanceOf('Symfony\Components\DependencyInjection\Reference', $arguments[1]);
$this->assertEquals('doctrine.orm.default_configuration', (string) $arguments[1]);
}
public function testSingleEntityManagerConfiguration()
{
$container = new ContainerBuilder();
$loader = $this->getDoctrineExtensionLoader();
$loader->dbalLoad(array(), $container);
$loader->ormLoad(array(), $container);
$definition = $container->getDefinition('doctrine.dbal.default_connection');
$this->assertEquals('Doctrine\DBAL\DriverManager', $definition->getClass());
$definition = $container->getDefinition('doctrine.orm.default_entity_manager');
$this->assertEquals('%doctrine.orm.entity_manager_class%', $definition->getClass());
$this->assertEquals('create', $definition->getFactoryMethod());
$arguments = $definition->getArguments();
$this->assertInstanceOf('Symfony\Components\DependencyInjection\Reference', $arguments[0]);
$this->assertEquals('doctrine.dbal.default_connection', (string) $arguments[0]);
$this->assertInstanceOf('Symfony\Components\DependencyInjection\Reference', $arguments[1]);
$this->assertEquals('doctrine.orm.default_configuration', (string) $arguments[1]);
}
public function testLoadSimpleSingleConnection()
{
$container = new ContainerBuilder();
$loader = $this->getDoctrineExtensionLoader();
$container->registerExtension($loader);
$loader->dbalLoad(array(), $container);
$loader->ormLoad(array(), $container);
$this->loadFromFile($container, 'orm_service_simple_single_entity_manager');
$container->freeze();
$definition = $container->getDefinition('doctrine.dbal.default_connection');
$this->assertEquals('Doctrine\DBAL\DriverManager', $definition->getClass());
$arguments = $definition->getArguments();
$this->assertEquals('Doctrine\DBAL\Driver\PDOMySql\Driver', $arguments[0]['driverClass']);
$this->assertEquals('localhost', $arguments[0]['host']);
$this->assertEquals('root', $arguments[0]['user']);
$this->assertEquals('doctrine.dbal.default_connection.configuration', (string) $arguments[1]);
$this->assertEquals('doctrine.dbal.default_connection.event_manager', (string) $arguments[2]);
$definition = $container->getDefinition('doctrine.orm.default_entity_manager');
$this->assertEquals('%doctrine.orm.entity_manager_class%', $definition->getClass());
$this->assertEquals('create', $definition->getFactoryMethod());
$arguments = $definition->getArguments();
$this->assertInstanceOf('Symfony\Components\DependencyInjection\Reference', $arguments[0]);
$this->assertEquals('doctrine.dbal.default_connection', (string) $arguments[0]);
$this->assertInstanceOf('Symfony\Components\DependencyInjection\Reference', $arguments[1]);
$this->assertEquals('doctrine.orm.default_configuration', (string) $arguments[1]);
}
public function testLoadSingleConnection()
{
$container = new ContainerBuilder();
$loader = $this->getDoctrineExtensionLoader();
$container->registerExtension($loader);
$this->loadFromFile($container, 'orm_service_single_entity_manager');
$container->freeze();
$definition = $container->getDefinition('doctrine.dbal.default_connection');
$this->assertEquals('Doctrine\DBAL\DriverManager', $definition->getClass());
$args = $definition->getArguments();
$this->assertEquals('Doctrine\DBAL\Driver\PDOSqlite\Driver', $args[0]['driverClass']);
$this->assertEquals('localhost', $args[0]['host']);
$this->assertEquals('sqlite_user', $args[0]['user']);
$this->assertEquals('doctrine.dbal.default_connection.configuration', (string) $args[1]);
$this->assertEquals('doctrine.dbal.default_connection.event_manager', (string) $args[2]);
$definition = $container->getDefinition('doctrine.orm.default_entity_manager');
$this->assertEquals('%doctrine.orm.entity_manager_class%', $definition->getClass());
$this->assertEquals('create', $definition->getFactoryMethod());
$arguments = $definition->getArguments();
$this->assertInstanceOf('Symfony\Components\DependencyInjection\Reference', $arguments[0]);
$this->assertEquals('doctrine.dbal.default_connection', (string) $arguments[0]);
$this->assertInstanceOf('Symfony\Components\DependencyInjection\Reference', $arguments[1]);
$this->assertEquals('doctrine.orm.default_configuration', (string) $arguments[1]);
}
public function testLoadMultipleConnections()
{
$container = new ContainerBuilder();
$loader = $this->getDoctrineExtensionLoader();
$container->registerExtension($loader);
$this->loadFromFile($container, 'orm_service_multiple_entity_managers');
$container->freeze();
$definition = $container->getDefinition('doctrine.dbal.conn1_connection');
$this->assertEquals('Doctrine\DBAL\DriverManager', $definition->getClass());
$args = $definition->getArguments();
$this->assertEquals('Doctrine\DBAL\Driver\PDOSqlite\Driver', $args[0]['driverClass']);
$this->assertEquals('localhost', $args[0]['host']);
$this->assertEquals('sqlite_user', $args[0]['user']);
$this->assertEquals('doctrine.dbal.conn1_connection.configuration', (string) $args[1]);
$this->assertEquals('doctrine.dbal.conn1_connection.event_manager', (string) $args[2]);
$this->assertEquals('doctrine.orm.dm2_entity_manager', $container->getAlias('doctrine.orm.entity_manager'));
$definition = $container->getDefinition('doctrine.orm.dm1_entity_manager');
$this->assertEquals('%doctrine.orm.entity_manager_class%', $definition->getClass());
$this->assertEquals('create', $definition->getFactoryMethod());
$arguments = $definition->getArguments();
$this->assertInstanceOf('Symfony\Components\DependencyInjection\Reference', $arguments[0]);
$this->assertEquals('doctrine.dbal.conn1_connection', (string) $arguments[0]);
$this->assertInstanceOf('Symfony\Components\DependencyInjection\Reference', $arguments[1]);
$this->assertEquals('doctrine.orm.dm1_configuration', (string) $arguments[1]);
$definition = $container->getDefinition('doctrine.dbal.conn2_connection');
$this->assertEquals('Doctrine\DBAL\DriverManager', $definition->getClass());
$args = $definition->getArguments();
$this->assertEquals('Doctrine\DBAL\Driver\PDOSqlite\Driver', $args[0]['driverClass']);
$this->assertEquals('localhost', $args[0]['host']);
$this->assertEquals('sqlite_user', $args[0]['user']);
$this->assertEquals('doctrine.dbal.conn2_connection.configuration', (string) $args[1]);
$this->assertEquals('doctrine.dbal.conn2_connection.event_manager', (string) $args[2]);
$definition = $container->getDefinition('doctrine.orm.dm2_entity_manager');
$this->assertEquals('%doctrine.orm.entity_manager_class%', $definition->getClass());
$this->assertEquals('create', $definition->getFactoryMethod());
$arguments = $definition->getArguments();
$this->assertInstanceOf('Symfony\Components\DependencyInjection\Reference', $arguments[0]);
$this->assertEquals('doctrine.dbal.conn2_connection', (string) $arguments[0]);
$this->assertInstanceOf('Symfony\Components\DependencyInjection\Reference', $arguments[1]);
$this->assertEquals('doctrine.orm.dm2_configuration', (string) $arguments[1]);
}
public function testBundleEntityAliases()
{
$container = new ContainerBuilder();
$loader = $this->getDoctrineExtensionLoader();
$loader->dbalLoad(array(), $container);
$loader->ormLoad(array(), $container);
$definition = $container->getDefinition('doctrine.orm.default_configuration');
$calls = $definition->getMethodCalls();
$this->assertTrue(isset($calls[0][1][0]['YamlBundle']));
$this->assertEquals('Fixtures\Bundles\YamlBundle\Entity', $calls[0][1][0]['YamlBundle']);
}
public function testYamlBundleMappingDetection()
{
$container = new ContainerBuilder();
$loader = $this->getDoctrineExtensionLoader('YamlBundle');
$loader->dbalLoad(array(), $container);
$loader->ormLoad(array(), $container);
$this->assertEquals(array(__DIR__.'/Fixtures/Bundles/YamlBundle/Resources/config/doctrine/metadata'), $container->getParameter('doctrine.orm.mapping_dirs'));
$this->assertEquals('%doctrine.orm.mapping_dirs%', $container->getParameter('doctrine.orm.xml_mapping_dirs'));
$this->assertEquals('%doctrine.orm.mapping_dirs%', $container->getParameter('doctrine.orm.yml_mapping_dirs'));
$this->assertEquals(array(__DIR__.'/Fixtures/Bundles/YamlBundle/Entity'), $container->getParameter('doctrine.orm.entity_dirs'));
$calls = $container->getDefinition('doctrine.orm.metadata_driver')->getMethodCalls();
$this->assertEquals('doctrine.orm.metadata_driver.yml', (string) $calls[0][1][0]);
$this->assertEquals('Fixtures\Bundles\YamlBundle\Entity', $calls[0][1][1]);
}
public function testXmlBundleMappingDetection()
{
$container = new ContainerBuilder();
$loader = $this->getDoctrineExtensionLoader('XmlBundle');
$loader->dbalLoad(array(), $container);
$loader->ormLoad(array(), $container);
$this->assertEquals(array(__DIR__.'/Fixtures/Bundles/XmlBundle/Resources/config/doctrine/metadata'), $container->getParameter('doctrine.orm.mapping_dirs'));
$this->assertEquals('%doctrine.orm.mapping_dirs%', $container->getParameter('doctrine.orm.xml_mapping_dirs'));
$this->assertEquals('%doctrine.orm.mapping_dirs%', $container->getParameter('doctrine.orm.yml_mapping_dirs'));
$this->assertEquals(array(__DIR__.'/Fixtures/Bundles/XmlBundle/Entity'), $container->getParameter('doctrine.orm.entity_dirs'));
$calls = $container->getDefinition('doctrine.orm.metadata_driver')->getMethodCalls();
$this->assertEquals('doctrine.orm.metadata_driver.xml', (string) $calls[0][1][0]);
$this->assertEquals('Fixtures\Bundles\XmlBundle\Entity', $calls[0][1][1]);
}
public function testAnnotationsBundleMappingDetection()
{
$container = new ContainerBuilder();
$loader = $this->getDoctrineExtensionLoader('AnnotationsBundle');
$loader->dbalLoad(array(), $container);
$loader->ormLoad(array(), $container);
$this->assertEquals(array(), $container->getParameter('doctrine.orm.mapping_dirs'));
$this->assertEquals('%doctrine.orm.mapping_dirs%', $container->getParameter('doctrine.orm.xml_mapping_dirs'));
$this->assertEquals('%doctrine.orm.mapping_dirs%', $container->getParameter('doctrine.orm.yml_mapping_dirs'));
$this->assertEquals(array(__DIR__.'/Fixtures/Bundles/AnnotationsBundle/Entity'), $container->getParameter('doctrine.orm.entity_dirs'));
$calls = $container->getDefinition('doctrine.orm.metadata_driver')->getMethodCalls();
$this->assertEquals('doctrine.orm.metadata_driver.annotation', (string) $calls[0][1][0]);
$this->assertEquals('Fixtures\Bundles\AnnotationsBundle\Entity', $calls[0][1][1]);
}
public function testEntityManagerMetadataCacheDriverConfiguration()
{
$container = new ContainerBuilder();
$loader = $this->getDoctrineExtensionLoader();
$container->registerExtension($loader);
$this->loadFromFile($container, 'orm_service_multiple_entity_managers');
$container->freeze();
$definition = $container->getDefinition('doctrine.orm.dm1_metadata_cache');
$this->assertEquals('%doctrine.orm.cache.xcache_class%', $definition->getClass());
$definition = $container->getDefinition('doctrine.orm.dm2_metadata_cache');
$this->assertEquals('%doctrine.orm.cache.apc_class%', $definition->getClass());
}
public function testEntityManagerMemcacheMetadataCacheDriverConfiguration()
{
$container = new ContainerBuilder();
$loader = $this->getDoctrineExtensionLoader();
$container->registerExtension($loader);
$this->loadFromFile($container, 'orm_service_simple_single_entity_manager');
$container->freeze();
$definition = $container->getDefinition('doctrine.orm.default_metadata_cache');
$this->assertEquals('Doctrine\Common\Cache\MemcacheCache', $definition->getClass());
$calls = $definition->getMethodCalls();
$this->assertEquals('setMemcache', $calls[0][0]);
$this->assertEquals('doctrine.orm.default_memcache_instance', (string) $calls[0][1][0]);
$definition = $container->getDefinition('doctrine.orm.default_memcache_instance');
$this->assertEquals('Memcache', $definition->getClass());
$calls = $definition->getMethodCalls();
$this->assertEquals('connect', $calls[0][0]);
$this->assertEquals('localhost', $calls[0][1][0]);
$this->assertEquals(11211, $calls[0][1][1]);
}
protected function getDoctrineExtensionLoader($bundle = 'YamlBundle')
{
require_once __DIR__.'/Fixtures/Bundles/'.$bundle.'/'.$bundle.'.php';
$bundleDirs = array('Fixtures\\Bundles' => __DIR__.'/Fixtures/Bundles');
$bundles = array('Fixtures\\Bundles\\'.$bundle.'\\'.$bundle);
return new DoctrineExtension($bundleDirs, $bundles, sys_get_temp_dir());
}
}

View File

@ -1,111 +0,0 @@
<?php
/*
* This file is part of the Symfony package.
*
* (c) Fabien Potencier <fabien.potencier@symfony-project.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Symfony\Bundle\DoctrineBundle\Tests\DependencyInjection;
use Symfony\Bundle\DoctrineBundle\Tests\TestCase;
use Symfony\Bundle\DoctrineBundle\DependencyInjection\DoctrineExtension;
use Symfony\Components\DependencyInjection\ContainerBuilder;
use Symfony\Components\DependencyInjection\Loader\XmlFileLoader;
class DoctrineExtensionTest extends TestCase
{
public function testDbalLoad()
{
$container = new ContainerBuilder();
$loader = new DoctrineExtension(array(), array(), sys_get_temp_dir());
$loader->dbalLoad(array(), $container);
$this->assertEquals('Symfony\\Bundle\\DoctrineBundle\\DataCollector\\DoctrineDataCollector', $container->getParameter('doctrine.data_collector.class'), '->dbalLoad() loads the dbal.xml file if not already loaded');
// doctrine.dbal.default_connection
$this->assertEquals('default', $container->getParameter('doctrine.dbal.default_connection'), '->dbalLoad() overrides existing configuration options');
$loader->dbalLoad(array('default_connection' => 'foo'), $container);
$this->assertEquals('foo', $container->getParameter('doctrine.dbal.default_connection'), '->dbalLoad() overrides existing configuration options');
$loader->dbalLoad(array(), $container);
$this->assertEquals('foo', $container->getParameter('doctrine.dbal.default_connection'), '->dbalLoad() overrides existing configuration options');
$container = new ContainerBuilder();
$loader = new DoctrineExtension(array(), array(), sys_get_temp_dir());
$loader->dbalLoad(array('password' => 'foo'), $container);
$arguments = $container->getDefinition('doctrine.dbal.default_connection')->getArguments();
$config = $arguments[0];
$this->assertEquals('foo', $config['password']);
$this->assertEquals('root', $config['user']);
$loader->dbalLoad(array('user' => 'foo'), $container);
$this->assertEquals('foo', $config['password']);
$this->assertEquals('root', $config['user']);
}
public function testDbalLoadFromXmlMultipleConnections()
{
$container = new ContainerBuilder();
$loader = new DoctrineExtension(array(), array(), sys_get_temp_dir());
$container->registerExtension($loader);
$loadXml = new XmlFileLoader($container, __DIR__.'/Fixtures/xml');
$loadXml->load('dbal_service_multiple_connections.xml');
$loader->dbalLoad(array(), $container);
$container->freeze();
// doctrine.dbal.mysql_connection
$arguments = $container->getDefinition('doctrine.dbal.mysql_connection')->getArguments();
$config = $arguments[0];
$this->assertEquals('mysql_s3cr3t', $config['password']);
$this->assertEquals('mysql_user', $config['user']);
$this->assertEquals('mysql_db', $config['dbname']);
$this->assertEquals('/path/to/mysqld.sock', $config['unix_socket']);
// doctrine.dbal.sqlite_connection
$arguments = $container->getDefinition('doctrine.dbal.sqlite_connection')->getArguments();
$config = $arguments[0];
$this->assertEquals('sqlite_s3cr3t', $config['password']);
$this->assertEquals('sqlite_user', $config['user']);
$this->assertEquals('sqlite_db', $config['dbname']);
$this->assertEquals(true, $config['memory']);
// doctrine.dbal.oci_connection
$arguments = $container->getDefinition('doctrine.dbal.oci_connection')->getArguments();
$config = $arguments[0];
$this->assertEquals('oracle_s3cr3t', $config['password']);
$this->assertEquals('oracle_user', $config['user']);
$this->assertEquals('oracle_db', $config['dbname']);
$this->assertEquals('utf8', $config['charset']);
}
public function testDbalLoadFromXmlSingleConnection()
{
$container = new ContainerBuilder();
$loader = new DoctrineExtension(array(), array(), sys_get_temp_dir());
$container->registerExtension($loader);
$loadXml = new XmlFileLoader($container, __DIR__.'/Fixtures/xml');
$loadXml->load('dbal_service_single_connection.xml');
$loader->dbalLoad(array(), $container);
$container->freeze();
// doctrine.dbal.mysql_connection
$arguments = $container->getDefinition('doctrine.dbal.mysql_connection')->getArguments();
$config = $arguments[0];
$this->assertEquals('mysql_s3cr3t', $config['password']);
$this->assertEquals('mysql_user', $config['user']);
$this->assertEquals('mysql_db', $config['dbname']);
$this->assertEquals('/path/to/mysqld.sock', $config['unix_socket']);
}
}

View File

@ -0,0 +1,7 @@
<?php
namespace Fixtures\Bundles\AnnotationsBundle\Entity;
class Test
{
}

View File

@ -0,0 +1,7 @@
<?php
namespace Fixtures\Bundles\XmlBundle\Entity;
class Test
{
}

View File

@ -1,6 +1,6 @@
<?php
namespace Fixtures\XmlBundle;
namespace Fixtures\Bundles\XmlBundle;
use Symfony\Framework\Bundle\Bundle;

View File

@ -0,0 +1,7 @@
<?php
namespace Fixtures\Bundles\YamlBundle\Entity;
class Test
{
}

View File

@ -1,6 +1,6 @@
<?php
namespace Fixtures\YamlBundle;
namespace Fixtures\Bundles\YamlBundle;
use Symfony\Framework\Bundle\Bundle;

View File

@ -0,0 +1,41 @@
<?xml version="1.0" ?>
<container xmlns="http://www.symfony-project.org/schema/dic/services"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:doctrine="http://www.symfony-project.org/schema/dic/doctrine"
xsi:schemaLocation="http://www.symfony-project.org/schema/dic/services http://www.symfony-project.org/schema/dic/services/services-1.0.xsd
http://www.symfony-project.org/schema/dic/doctrine/orm http://www.symfony-project.org/schema/dic/doctrine/orm/doctrine-1.0.xsd
http://www.symfony-project.org/schema/dic/doctrine/dbal http://www.symfony-project.org/schema/dic/doctrine/dbal/doctrine-1.0.xsd">
<doctrine:dbal>
<doctrine:connections>
<doctrine:connection
id="conn1"
driver="PDOSqlite"
dbname="sqlite_db"
user="sqlite_user"
password="sqlite_s3cr3t"
memory="true" />
<doctrine:connection
id="conn2"
driver="PDOSqlite"
dbname="sqlite_db"
user="sqlite_user"
password="sqlite_s3cr3t"
memory="true" />
</doctrine:connections>
</doctrine:dbal>
<doctrine:orm
metadata_cache_driver="apc"
default_entity_manager="dm2"
default_connection="conn1"
proxy_namespace="Proxies"
auto_generate_proxy_classes="true"
>
<doctrine:entity_managers>
<doctrine:entity_manager id="dm1" metadata_cache_driver="xcache" connection="conn1" />
<doctrine:entity_manager id="dm2" connection="conn2" />
</doctrine:entity_managers>
</doctrine:orm>
</container>

View File

@ -0,0 +1,19 @@
<?xml version="1.0" ?>
<container xmlns="http://www.symfony-project.org/schema/dic/services"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:doctrine="http://www.symfony-project.org/schema/dic/doctrine"
xsi:schemaLocation="http://www.symfony-project.org/schema/dic/services http://www.symfony-project.org/schema/dic/services/services-1.0.xsd
http://www.symfony-project.org/schema/dic/doctrine/orm http://www.symfony-project.org/schema/dic/doctrine/orm/doctrine-1.0.xsd
http://www.symfony-project.org/schema/dic/doctrine/dbal http://www.symfony-project.org/schema/dic/doctrine/dbal/doctrine-1.0.xsd">
<doctrine:dbal />
<doctrine:orm>
<metadata_cache_driver type="memcache">
<class>Doctrine\Common\Cache\MemcacheCache</class>
<host>localhost</host>
<port>11211</port>
<instance_class>Memcache</instance_class>
</metadata_cache_driver>
</doctrine:orm>
</container>

View File

@ -0,0 +1,40 @@
<?xml version="1.0" ?>
<container xmlns="http://www.symfony-project.org/schema/dic/services"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:doctrine="http://www.symfony-project.org/schema/dic/doctrine"
xsi:schemaLocation="http://www.symfony-project.org/schema/dic/services http://www.symfony-project.org/schema/dic/services/services-1.0.xsd
http://www.symfony-project.org/schema/dic/doctrine/orm http://www.symfony-project.org/schema/dic/doctrine/orm/doctrine-1.0.xsd
http://www.symfony-project.org/schema/dic/doctrine/dbal http://www.symfony-project.org/schema/dic/doctrine/dbal/doctrine-1.0.xsd">
<doctrine:dbal>
<doctrine:connections>
<doctrine:connection
id="default"
driver="PDOSqlite"
dbname="sqlite_db"
user="sqlite_user"
password="sqlite_s3cr3t"
memory="true" />
</doctrine:connections>
</doctrine:dbal>
<doctrine:orm
metadata_cache_driver="apc"
default_entity_manager="dm2"
default_connection="conn1"
proxy_namespace="Proxies"
auto_generate_proxy_classes="true"
>
<doctrine:entity_managers>
<doctrine:entity_manager id="default" connection="default">
<metadata_cache_driver type="memcache">
<class>Doctrine\Common\Cache\MemcacheCache</class>
<host>localhost</host>
<port>11211</port>
<instance_class>Memcache</instance_class>
</metadata_cache_driver>
</doctrine:entity_manager>
</doctrine:entity_managers>
</doctrine:orm>
</container>

View File

@ -0,0 +1,19 @@
doctrine.dbal:
connections:
mysql:
dbname: mysql_db
user: mysql_user
password: mysql_s3cr3t
unix_socket: /path/to/mysqld.sock
sqlite:
driver: PDOSqlite
dbname: sqlite_db
user: sqlite_user
password: sqlite_s3cr3t
memory: true
oci:
driver: OCI8
dbname: oracle_db
user: oracle_user
password: oracle_s3cr3t
charset: utf8

View File

@ -0,0 +1,7 @@
doctrine.dbal:
connections:
mysql:
dbname: mysql_db
user: mysql_user
password: mysql_s3cr3t
unix_socket: /path/to/mysqld.sock

View File

@ -0,0 +1,27 @@
doctrine.dbal:
connections:
conn1:
driver: PDOSqlite
dbname: sqlite_db
user: sqlite_user
password: sqlite_s3cr3t
memory: true
conn2:
driver: PDOSqlite
dbname: sqlite_db
user: sqlite_user
password: sqlite_s3cr3t
memory: true
doctrine.orm:
metadata_cache_driver: apc
default_entity_manager: dm2
default_connection: conn1
proxy_namespace: Proxies
auto_generate_proxy_classes: true
entity_managers:
dm1:
metadata_cache_driver: xcache
connection: conn1
dm2:
connection: conn2

View File

@ -0,0 +1,8 @@
doctrine.dbal: ~
doctrine.orm:
metadata_cache_driver:
type: memcache
class: Doctrine\Common\Cache\MemcacheCache
host: localhost
port: 11211
instance_class: Memcache

View File

@ -0,0 +1,24 @@
doctrine.dbal:
connections:
default:
driver: PDOSqlite
dbname: sqlite_db
user: sqlite_user
password: sqlite_s3cr3t
memory: true
doctrine.orm:
metadata_cache_driver: apc
default_entity_manager: dm2
default_connection: conn1
proxy_namespace: Proxies
auto_generate_proxy_classes: true
entity_managers:
default:
connection: default
metadata_cache_driver:
type: memcache
class: Doctrine\Common\Cache\MemcacheCache
host: localhost
port: 11211
instance_class: Memcache

View File

@ -0,0 +1,24 @@
<?php
/*
* This file is part of the Symfony package.
*
* (c) Fabien Potencier <fabien.potencier@symfony-project.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Symfony\Bundle\DoctrineBundle\Tests\DependencyInjection;
use Symfony\Components\DependencyInjection\ContainerBuilder;
use Symfony\Components\DependencyInjection\Loader\XmlFileLoader;
class XmlDoctrineExtensionTest extends AbstractDoctrineExtensionTest
{
protected function loadFromFile(ContainerBuilder $container, $file)
{
$loadXml = new XmlFileLoader($container, __DIR__.'/Fixtures/config/xml');
$loadXml->load($file.'.xml');
}
}

View File

@ -0,0 +1,24 @@
<?php
/*
* This file is part of the Symfony package.
*
* (c) Fabien Potencier <fabien.potencier@symfony-project.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Symfony\Bundle\DoctrineBundle\Tests\DependencyInjection;
use Symfony\Components\DependencyInjection\ContainerBuilder;
use Symfony\Components\DependencyInjection\Loader\YamlFileLoader;
class YamlDoctrineExtensionTest extends AbstractDoctrineExtensionTest
{
protected function loadFromFile(ContainerBuilder $container, $file)
{
$loadYaml = new YamlFileLoader($container, __DIR__.'/Fixtures/config/yml');
$loadYaml->load($file.'.yml');
}
}

View File

@ -15,15 +15,12 @@ use Symfony\Components\DependencyInjection\Resource\FileResource;
* @author Bulat Shakirzyanov <bulat@theopenskyproject.com>
* @author Kris Wallsmith <kris.wallsmith@symfony-project.com>
* @author Jonathan H. Wage <jonwage@gmail.com>
*
* @todo Add support for multiple document managers
*/
class MongoDBExtension extends Extension
{
protected $resources = array(
'mongodb' => 'mongodb.xml',
);
protected $bundleDirs;
protected $bundles;
protected $kernelCacheDir;
@ -36,10 +33,14 @@ class MongoDBExtension extends Extension
}
/**
* Loads the MongoDB configuration.
* Loads the MongoDB ODM configuration.
*
* @param array $config An array of configuration settings
* @param \Symfony\Components\DependencyInjection\ContainerBuilder $container A ContainerBuilder instance
* Usage example:
*
* <doctrine:mongodb server="mongodb://localhost:27017" />
*
* @param array $config An array of configuration settings
* @param ContainerBuilder $container A ContainerBuilder instance
*/
public function mongodbLoad($config, ContainerBuilder $container)
{
@ -68,8 +69,8 @@ class MongoDBExtension extends Extension
/**
* Loads the default configuration.
*
* @param array $config An array of configuration settings
* @param \Symfony\Components\DependencyInjection\ContainerBuilder $container A ContainerBuilder instance
* @param array $config An array of configuration settings
* @param ContainerBuilder $container A ContainerBuilder instance
*/
protected function loadDefaults(array $config, ContainerBuilder $container)
{
@ -79,6 +80,8 @@ class MongoDBExtension extends Extension
// Allow these application configuration options to override the defaults
$options = array(
'default_document_manager',
'default_connection',
'cache_driver',
'metadata_cache_driver',
'proxy_namespace',
@ -96,8 +99,8 @@ class MongoDBExtension extends Extension
/**
* Loads the document managers configuration.
*
* @param array $config An array of configuration settings
* @param \Symfony\Components\DependencyInjection\ContainerBuilder $container A ContainerBuilder instance
* @param array $config An array of configuration settings
* @param ContainerBuilder $container A ContainerBuilder instance
*/
protected function loadDocumentManagers(array $config, ContainerBuilder $container)
{
@ -117,7 +120,7 @@ class MongoDBExtension extends Extension
* Loads a document manager configuration.
*
* @param array $documentManager A document manager configuration array
* @param \Symfony\Components\DependencyInjection\ContainerBuilder $container A ContainerBuilder instance
* @param ContainerBuilder $container A ContainerBuilder instance
*/
protected function loadDocumentManager(array $documentManager, ContainerBuilder $container)
{
@ -142,7 +145,7 @@ class MongoDBExtension extends Extension
}
$odmDmArgs = array(
new Reference(sprintf('doctrine.odm.mongodb.%s_connection', isset($documentManager['connection']) ? $documentManager['connection'] : 'default')),
new Reference(sprintf('doctrine.odm.mongodb.%s_connection', isset($documentManager['connection']) ? $documentManager['connection'] : $documentManager['name'])),
new Reference(sprintf('doctrine.odm.mongodb.%s_configuration', $documentManager['name']))
);
$odmDmDef = new Definition('%doctrine.odm.mongodb.document_manager_class%', $odmDmArgs);
@ -160,14 +163,11 @@ class MongoDBExtension extends Extension
/**
* Gets the configured document managers.
*
* @param array $config An array of configuration settings
* @param \Symfony\Components\DependencyInjection\ContainerBuilder $container A ContainerBuilder instance
* @param array $config An array of configuration settings
* @param ContainerBuilder $container A ContainerBuilder instance
*/
protected function getDocumentManagers(array $config, ContainerBuilder $container)
{
if (isset($config['default_document_manager'])) {
$container->setParameter('doctrine.odm.mongodb.default_document_manager', $config['default_document_manager']);
}
$defaultDocumentManager = $container->getParameter('doctrine.odm.mongodb.default_document_manager');
$documentManagers = array();
@ -190,8 +190,8 @@ class MongoDBExtension extends Extension
/**
* Loads a document managers bundles mapping information configuration.
*
* @param array $config An array of configuration settings
* @param \Symfony\Components\DependencyInjection\ContainerBuilder $container A ContainerBuilder instance
* @param array $config An array of configuration settings
* @param ContainerBuilder $container A ContainerBuilder instance
*/
protected function loadDocumentManagerBundlesMappingInformation(array $documentManager, Definition $odmConfigDef, ContainerBuilder $container)
{
@ -200,7 +200,6 @@ class MongoDBExtension extends Extension
$bundleDocumentMappings = array();
$bundleDirs = $this->bundleDirs;
$aliasMap = array();
foreach ($this->bundles as $className) {
$tmp = dirname(str_replace('\\', '/', $className));
$namespace = str_replace('/', '\\', dirname($tmp));
@ -236,7 +235,7 @@ class MongoDBExtension extends Extension
* Loads the configured document manager metadata cache driver.
*
* @param array $config A configured document manager array
* @param \Symfony\Components\DependencyInjection\ContainerBuilder $container A ContainerBuilder instance
* @param ContainerBuilder $container A ContainerBuilder instance
*/
protected function loadDocumentManagerMetadataCacheDriver(array $documentManager, ContainerBuilder $container)
{
@ -263,8 +262,8 @@ class MongoDBExtension extends Extension
/**
* Loads the configured connections.
*
* @param array $config An array of configuration settings
* @param \Symfony\Components\DependencyInjection\ContainerBuilder $container A ContainerBuilder instance
* @param array $config An array of configuration settings
* @param ContainerBuilder $container A ContainerBuilder instance
*/
protected function loadConnections(array $config, ContainerBuilder $container)
{
@ -282,14 +281,11 @@ class MongoDBExtension extends Extension
/**
* Gets the configured connections.
*
* @param array $config An array of configuration settings
* @param \Symfony\Components\DependencyInjection\ContainerBuilder $container A ContainerBuilder instance
* @param array $config An array of configuration settings
* @param ContainerBuilder $container A ContainerBuilder instance
*/
protected function getConnections(array $config, ContainerBuilder $container)
{
if (isset($config['default_connection'])) {
$container->setParameter('doctrine.odm.mongodb.default_connection', $config['default_connection']);
}
$defaultConnection = $container->getParameter('doctrine.odm.mongodb.default_connection');
$connections = array();
@ -312,7 +308,7 @@ class MongoDBExtension extends Extension
* Finds existing bundle subpaths.
*
* @param string $path A subpath to check for
* @param Symfony\Components\DependencyInjection\ContainerBuilder $container A ContainerBuilder configuration
* @param ContainerBuilder $container A ContainerBuilder configuration
*
* @return array An array of absolute directory paths
*/
@ -339,7 +335,7 @@ class MongoDBExtension extends Extension
* Detects what metadata driver to use for the supplied directory.
*
* @param string $dir A directory path
* @param Symfony\Components\DependencyInjection\ContainerBuilder $container A ContainerBuilder configuration
* @param ContainerBuilder $container A ContainerBuilder configuration
*
* @return string|null A metadata driver short name, if one can be detected
*/

View File

@ -26,6 +26,7 @@ class DoctrineMongoDBBundle extends Bundle
public function buildContainer(ParameterBagInterface $parameterBag)
{
ContainerBuilder::registerExtension(new MongoDBExtension(
$parameterBag->get('kernel.bundle_dirs'),
$parameterBag->get('kernel.bundles'),
$parameterBag->get('kernel.cache_dir')
));

View File

@ -19,6 +19,8 @@ use Symfony\Components\DependencyInjection\Loader\YamlFileLoader;
abstract class AbstractMongoDBExtensionTest extends TestCase
{
abstract protected function loadFromFile(ContainerBuilder $container, $file);
public function testDependencyInjectionConfigurationDefaults()
{
$container = new ContainerBuilder();
@ -196,7 +198,7 @@ abstract class AbstractMongoDBExtensionTest extends TestCase
$definition = $container->getDefinition('doctrine.odm.mongodb.default_configuration');
$calls = $definition->getMethodCalls();
$this->assertTrue(isset($calls[0][1][0]['YamlBundle']));
$this->assertEquals('Fixtures\YamlBundle\Document', $calls[0][1][0]['YamlBundle']);
$this->assertEquals('Fixtures\Bundles\YamlBundle\Document', $calls[0][1][0]['YamlBundle']);
}
public function testYamlBundleMappingDetection()
@ -206,14 +208,14 @@ abstract class AbstractMongoDBExtensionTest extends TestCase
$loader->mongodbLoad(array(), $container);
$this->assertEquals(array(__DIR__.'/Fixtures/YamlBundle/Resources/config/doctrine/metadata'), $container->getParameter('doctrine.odm.mongodb.mapping_dirs'));
$this->assertEquals(array(__DIR__.'/Fixtures/Bundles/YamlBundle/Resources/config/doctrine/metadata'), $container->getParameter('doctrine.odm.mongodb.mapping_dirs'));
$this->assertEquals('%doctrine.odm.mongodb.mapping_dirs%', $container->getParameter('doctrine.odm.mongodb.xml_mapping_dirs'));
$this->assertEquals('%doctrine.odm.mongodb.mapping_dirs%', $container->getParameter('doctrine.odm.mongodb.yml_mapping_dirs'));
$this->assertEquals(array(__DIR__.'/Fixtures/YamlBundle/Document'), $container->getParameter('doctrine.odm.mongodb.document_dirs'));
$this->assertEquals(array(__DIR__.'/Fixtures/Bundles/YamlBundle/Document'), $container->getParameter('doctrine.odm.mongodb.document_dirs'));
$calls = $container->getDefinition('doctrine.odm.mongodb.metadata_driver')->getMethodCalls();
$this->assertEquals('doctrine.odm.mongodb.metadata_driver.yml', (string) $calls[0][1][0]);
$this->assertEquals('Fixtures\YamlBundle\Document', $calls[0][1][1]);
$this->assertEquals('Fixtures\Bundles\YamlBundle\Document', $calls[0][1][1]);
}
public function testXmlBundleMappingDetection()
@ -223,14 +225,14 @@ abstract class AbstractMongoDBExtensionTest extends TestCase
$loader->mongodbLoad(array(), $container);
$this->assertEquals(array(__DIR__.'/Fixtures/XmlBundle/Resources/config/doctrine/metadata'), $container->getParameter('doctrine.odm.mongodb.mapping_dirs'));
$this->assertEquals(array(__DIR__.'/Fixtures/Bundles/XmlBundle/Resources/config/doctrine/metadata'), $container->getParameter('doctrine.odm.mongodb.mapping_dirs'));
$this->assertEquals('%doctrine.odm.mongodb.mapping_dirs%', $container->getParameter('doctrine.odm.mongodb.xml_mapping_dirs'));
$this->assertEquals('%doctrine.odm.mongodb.mapping_dirs%', $container->getParameter('doctrine.odm.mongodb.yml_mapping_dirs'));
$this->assertEquals(array(__DIR__.'/Fixtures/XmlBundle/Document'), $container->getParameter('doctrine.odm.mongodb.document_dirs'));
$this->assertEquals(array(__DIR__.'/Fixtures/Bundles/XmlBundle/Document'), $container->getParameter('doctrine.odm.mongodb.document_dirs'));
$calls = $container->getDefinition('doctrine.odm.mongodb.metadata_driver')->getMethodCalls();
$this->assertEquals('doctrine.odm.mongodb.metadata_driver.xml', (string) $calls[0][1][0]);
$this->assertEquals('Fixtures\XmlBundle\Document', $calls[0][1][1]);
$this->assertEquals('Fixtures\Bundles\XmlBundle\Document', $calls[0][1][1]);
}
public function testAnnotationsBundleMappingDetection()
@ -243,11 +245,11 @@ abstract class AbstractMongoDBExtensionTest extends TestCase
$this->assertEquals(array(), $container->getParameter('doctrine.odm.mongodb.mapping_dirs'));
$this->assertEquals('%doctrine.odm.mongodb.mapping_dirs%', $container->getParameter('doctrine.odm.mongodb.xml_mapping_dirs'));
$this->assertEquals('%doctrine.odm.mongodb.mapping_dirs%', $container->getParameter('doctrine.odm.mongodb.yml_mapping_dirs'));
$this->assertEquals(array(__DIR__.'/Fixtures/AnnotationsBundle/Document'), $container->getParameter('doctrine.odm.mongodb.document_dirs'));
$this->assertEquals(array(__DIR__.'/Fixtures/Bundles/AnnotationsBundle/Document'), $container->getParameter('doctrine.odm.mongodb.document_dirs'));
$calls = $container->getDefinition('doctrine.odm.mongodb.metadata_driver')->getMethodCalls();
$this->assertEquals('doctrine.odm.mongodb.metadata_driver.annotation', (string) $calls[0][1][0]);
$this->assertEquals('Fixtures\AnnotationsBundle\Document', $calls[0][1][1]);
$this->assertEquals('Fixtures\Bundles\AnnotationsBundle\Document', $calls[0][1][1]);
}
public function testDocumentManagerMetadataCacheDriverConfiguration()
@ -295,9 +297,9 @@ abstract class AbstractMongoDBExtensionTest extends TestCase
protected function getMongoDbExtensionLoader($bundle = 'YamlBundle')
{
require_once __DIR__.'/Fixtures/'.$bundle.'/'.$bundle.'.php';
$bundleDirs = array('Fixtures' => __DIR__.'/Fixtures');
$bundles = array('Fixtures\\'.$bundle.'\\'.$bundle);
require_once __DIR__.'/Fixtures/Bundles/'.$bundle.'/'.$bundle.'.php';
$bundleDirs = array('Fixtures\\Bundles' => __DIR__.'/Fixtures/Bundles');
$bundles = array('Fixtures\\Bundles\\'.$bundle.'\\'.$bundle);
return new MongoDBExtension($bundleDirs, $bundles, sys_get_temp_dir());
}
}

View File

@ -1,7 +0,0 @@
<?php
namespace Fixtures\AnnotationsBundle\Document;
class Test
{
}

View File

@ -0,0 +1,10 @@
<?php
namespace Fixtures\Bundles\AnnotationsBundle;
use Symfony\Framework\Bundle\Bundle;
class AnnotationsBundle extends Bundle
{
}

View File

@ -0,0 +1,7 @@
<?php
namespace Fixtures\Bundles\AnnotationsBundle\Document;
class Test
{
}

View File

@ -0,0 +1,7 @@
<?php
namespace Fixtures\Bundles\XmlBundle\Document;
class Test
{
}

View File

@ -0,0 +1,10 @@
<?php
namespace Fixtures\Bundles\XmlBundle;
use Symfony\Framework\Bundle\Bundle;
class XmlBundle extends Bundle
{
}

View File

@ -0,0 +1,7 @@
<?php
namespace Fixtures\Bundles\YamlBundle\Document;
class Test
{
}

View File

@ -0,0 +1,10 @@
<?php
namespace Fixtures\Bundles\YamlBundle;
use Symfony\Framework\Bundle\Bundle;
class YamlBundle extends Bundle
{
}

View File

@ -1,7 +0,0 @@
<?php
namespace Fixtures\XmlBundle\Document;
class Test
{
}

View File

@ -1,7 +0,0 @@
<?php
namespace Fixtures\YamlBundle\Document;
class Test
{
}

View File

@ -9,7 +9,7 @@
<doctrine:mongodb
metadata_cache_driver="apc"
default_document_manager="dm2"
default_connection="dm2"
default_connection="conn1"
proxy_namespace="Proxies"
auto_generate_proxy_classes="true"
>
@ -26,8 +26,8 @@
</doctrine:connection>
</doctrine:connections>
<doctrine:document_managers>
<doctrine:document_manager id="dm1" server="mongodb://localhost:27017" metadata_cache_driver="xcache" connection="conn1" />
<doctrine:document_manager id="dm2" server="mongodb://localhost:27017" connection="conn2" />
<doctrine:document_manager id="dm1" metadata_cache_driver="xcache" connection="conn1" />
<doctrine:document_manager id="dm2" connection="conn2" />
</doctrine:document_managers>
</doctrine:mongodb>
</container>

View File

@ -15,7 +15,7 @@
</doctrine:connection>
</doctrine:connections>
<doctrine:document_managers>
<doctrine:document_manager id="default" server="mongodb://localhost:27017" connection="default">
<doctrine:document_manager id="default" connection="default">
<metadata_cache_driver type="memcache">
<class>Doctrine\Common\Cache\MemcacheCache</class>
<host>localhost</host>

View File

@ -18,7 +18,7 @@ class XmlMongoDBExtensionTest extends AbstractMongoDBExtensionTest
{
protected function loadFromFile(ContainerBuilder $container, $file)
{
$loadXml = new XmlFileLoader($container, __DIR__.'/Fixtures/xml');
$loadXml = new XmlFileLoader($container, __DIR__.'/Fixtures/config/xml');
$loadXml->load($file.'.xml');
}
}

View File

@ -18,7 +18,7 @@ class YamlMongoDBExtensionTest extends AbstractMongoDBExtensionTest
{
protected function loadFromFile(ContainerBuilder $container, $file)
{
$loadYaml = new YamlFileLoader($container, __DIR__.'/Fixtures/yml');
$loadYaml = new YamlFileLoader($container, __DIR__.'/Fixtures/config/yml');
$loadYaml->load($file.'.yml');
}
}