added a default implementation of the ManagerRegistry integrating the container

attempted to maintain BC as good as possible, but RegistryInterface::getRepository() had to be dropped from RegistryInterface. Its still part of the ManagerRegistry, so its only a BC break for people using RegistryInterface to create their own implementation
This commit is contained in:
Lukas Kahwe Smith 2011-09-23 09:26:24 +02:00
parent 645bd8215e
commit 13c2f33af8
3 changed files with 74 additions and 162 deletions

View File

@ -0,0 +1,53 @@
<?php
/*
* This file is part of the Symfony package.
*
* (c) Fabien Potencier <fabien@symfony.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Symfony\Bridge\Doctrine;
use Symfony\Component\DependencyInjection\ContainerAwareInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Doctrine\Common\ManagerRegistry as BaseManagerRegistry;
/**
* References Doctrine connections and entity/document managers.
*
* @author Lukas Kahwe Smith <smith@pooteeweet.org>
*/
class ManagerRegistry extends BaseManagerRegistry implements ContainerAwareInterface
{
/**
* @var ContainerInterface
*/
protected $container;
/**
* @inheritdoc
*/
protected function getService($name)
{
return $this->container->get($name);
}
/**
* @inheritdoc
*/
protected function resetService($name)
{
$this->container->set($name, null);
}
/**
* @inheritdoc
*/
public function setContainer(ContainerInterface $container = null)
{
$this->container = $container;
}
}

View File

@ -15,43 +15,15 @@ use Doctrine\DBAL\Connection;
use Doctrine\ORM\Configuration; use Doctrine\ORM\Configuration;
use Doctrine\ORM\ORMException; use Doctrine\ORM\ORMException;
use Doctrine\Common\Persistence\ConnectionRegistry as ConnectionRegistryInterface;
/** /**
* References Doctrine connections and entity managers. * References Doctrine connections and entity managers.
* *
* @author Fabien Potencier <fabien@symfony.com> * @author Fabien Potencier <fabien@symfony.com>
*/ */
interface RegistryInterface interface RegistryInterface extends ConnectionRegistryInterface
{ {
/**
* Gets the default connection name.
*
* @return string The default connection name
*/
function getDefaultConnectionName();
/**
* Gets the named connection.
*
* @param string $name The connection name (null for the default one)
*
* @return Connection
*/
function getConnection($name = null);
/**
* Gets an array of all registered connections
*
* @return array An array of Connection instances
*/
function getConnections();
/**
* Gets all connection names.
*
* @return array An array of connection names
*/
function getConnectionNames();
/** /**
* Gets the default entity manager name. * Gets the default entity manager name.
* *
@ -114,16 +86,6 @@ interface RegistryInterface
*/ */
function getEntityManagerNames(); function getEntityManagerNames();
/**
* Gets the EntityRepository for an entity.
*
* @param string $entityName The name of the entity.
* @param string $entityManagerNAme The entity manager name (null for the default one)
*
* @return Doctrine\ORM\EntityRepository
*/
function getRepository($entityName, $entityManagerName = null);
/** /**
* Gets the entity manager associated with a given class. * Gets the entity manager associated with a given class.
* *

View File

@ -13,6 +13,7 @@ namespace Symfony\Bundle\DoctrineBundle;
use Symfony\Component\DependencyInjection\ContainerInterface; use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Bridge\Doctrine\RegistryInterface; use Symfony\Bridge\Doctrine\RegistryInterface;
use Symfony\Bridge\Doctrine\ManagerRegistry;
use Doctrine\DBAL\Connection; use Doctrine\DBAL\Connection;
use Doctrine\ORM\Configuration; use Doctrine\ORM\Configuration;
use Doctrine\ORM\ORMException; use Doctrine\ORM\ORMException;
@ -22,86 +23,25 @@ use Doctrine\ORM\ORMException;
* *
* @author Fabien Potencier <fabien@symfony.com> * @author Fabien Potencier <fabien@symfony.com>
*/ */
class Registry implements RegistryInterface class Registry extends ManagerRegistry implements RegistryInterface
{ {
private $container;
private $connections;
private $entityManagers;
private $defaultConnection;
private $defaultEntityManager;
public function __construct(ContainerInterface $container, array $connections, array $entityManagers, $defaultConnection, $defaultEntityManager) public function __construct(ContainerInterface $container, array $connections, array $entityManagers, $defaultConnection, $defaultEntityManager)
{ {
$this->container = $container; $this->setContainer($container);
$this->connections = $connections;
$this->entityManagers = $entityManagers;
$this->defaultConnection = $defaultConnection;
$this->defaultEntityManager = $defaultEntityManager;
}
/** parent::__construct('ORM', $connections, $entityManagers, $defaultConnection, $defaultEntityManager, 'Doctrine\ORM\Proxy\Proxy');
* Gets the default connection name.
*
* @return string The default connection name
*/
public function getDefaultConnectionName()
{
return $this->defaultConnection;
}
/**
* Gets the named connection.
*
* @param string $name The connection name (null for the default one)
*
* @return Connection
*/
public function getConnection($name = null)
{
if (null === $name) {
$name = $this->defaultConnection;
}
if (!isset($this->connections[$name])) {
throw new \InvalidArgumentException(sprintf('Doctrine Connection named "%s" does not exist.', $name));
}
return $this->container->get($this->connections[$name]);
}
/**
* Gets an array of all registered connections
*
* @return array An array of Connection instances
*/
public function getConnections()
{
$connections = array();
foreach ($this->connections as $name => $id) {
$connections[$name] = $this->container->get($id);
}
return $connections;
}
/**
* Gets all connection names.
*
* @return array An array of connection names
*/
public function getConnectionNames()
{
return $this->connections;
} }
/** /**
* Gets the default entity manager name. * Gets the default entity manager name.
* *
* @return string The default entity manager name * @return string The default entity manager name
*
* @deprecated
*/ */
public function getDefaultEntityManagerName() public function getDefaultEntityManagerName()
{ {
return $this->defaultEntityManager; return $this->getDefaultManagerName();
} }
/** /**
@ -110,33 +50,24 @@ class Registry implements RegistryInterface
* @param string $name The entity manager name (null for the default one) * @param string $name The entity manager name (null for the default one)
* *
* @return EntityManager * @return EntityManager
*
* @deprecated
*/ */
public function getEntityManager($name = null) public function getEntityManager($name = null)
{ {
if (null === $name) { return $this->getManager($name);
$name = $this->defaultEntityManager;
}
if (!isset($this->entityManagers[$name])) {
throw new \InvalidArgumentException(sprintf('Doctrine EntityManager named "%s" does not exist.', $name));
}
return $this->container->get($this->entityManagers[$name]);
} }
/** /**
* Gets an array of all registered entity managers * Gets an array of all registered entity managers
* *
* @return array An array of EntityManager instances * @return array An array of EntityManager instances
*
* @deprecated
*/ */
public function getEntityManagers() public function getEntityManagers()
{ {
$ems = array(); return $this->getManagers();
foreach ($this->entityManagers as $name => $id) {
$ems[$name] = $this->container->get($id);
}
return $ems;
} }
/** /**
@ -158,17 +89,7 @@ class Registry implements RegistryInterface
*/ */
public function resetEntityManager($name = null) public function resetEntityManager($name = null)
{ {
if (null === $name) { $this->resetManager($name);
$name = $this->defaultEntityManager;
}
if (!isset($this->entityManagers[$name])) {
throw new \InvalidArgumentException(sprintf('Doctrine EntityManager named "%s" does not exist.', $name));
}
// force the creation of a new entity manager
// if the current one is closed
$this->container->set($this->entityManagers[$name], null);
} }
/** /**
@ -184,9 +105,9 @@ class Registry implements RegistryInterface
*/ */
public function getEntityNamespace($alias) public function getEntityNamespace($alias)
{ {
foreach (array_keys($this->entityManagers) as $name) { foreach (array_keys($this->getManagers()) as $name) {
try { try {
return $this->getEntityManager($name)->getConfiguration()->getEntityNamespace($alias); return $this->getManager($name)->getConfiguration()->getEntityNamespace($alias);
} catch (ORMException $e) { } catch (ORMException $e) {
} }
} }
@ -201,20 +122,7 @@ class Registry implements RegistryInterface
*/ */
public function getEntityManagerNames() public function getEntityManagerNames()
{ {
return $this->entityManagers; return $this->getManagerNames();
}
/**
* Gets the EntityRepository for an entity.
*
* @param string $entityName The name of the entity.
* @param string $entityManagerNAme The entity manager name (null for the default one)
*
* @return Doctrine\ORM\EntityRepository
*/
public function getRepository($entityName, $entityManagerName = null)
{
return $this->getEntityManager($entityManagerName)->getRepository($entityName);
} }
/** /**
@ -226,17 +134,6 @@ class Registry implements RegistryInterface
*/ */
public function getEntityManagerForClass($class) public function getEntityManagerForClass($class)
{ {
$proxyClass = new \ReflectionClass($class); return $this->getManagerForClass($class);
if ($proxyClass->implementsInterface('Doctrine\ORM\Proxy\Proxy')) {
$class = $proxyClass->getParentClass()->getName();
}
foreach ($this->entityManagers as $id) {
$em = $this->container->get($id);
if (!$em->getConfiguration()->getMetadataDriverImpl()->isTransient($class)) {
return $em;
}
}
} }
} }