浏览代码

refactored Doctrine Bridge

 * added a RegistryInterface

 * changed all classes to depend on the Registry instead of a specific EntityManager

This is more consistent as the validator already took the registry and this allows
to use any entity manager in Forms.
Fabien Potencier 14 年之前
父节点
当前提交
fbf36957e6

+ 4 - 0
UPDATE.md

@@ -9,6 +9,10 @@ timeline closely anyway.
 beta4 to beta5
 --------------
 
+* The `em` option of the Doctrine `EntityType` class now takes the entity
+  manager name instead of the EntityManager instance. If you don't pass this
+  option, the default Entity Manager will be used as before.
+
 * In the Console component: `Command::getFullname()` and
   `Command::getNamespace()` have been removed (`Command::getName()` behavior
   is now the same as the old `Command::getFullname()`).

+ 6 - 10
src/Symfony/Bridge/Doctrine/Form/DoctrineOrmExtension.php

@@ -12,30 +12,26 @@
 namespace Symfony\Bridge\Doctrine\Form;
 
 use Symfony\Component\Form\AbstractExtension;
-use Doctrine\ORM\EntityManager;
+use Symfony\Bridge\Doctrine\RegistryInterface;
 
 class DoctrineOrmExtension extends AbstractExtension
 {
-    /**
-     * The Doctrine 2 entity manager
-     * @var Doctrine\ORM\EntityManager
-     */
-    protected $em = null;
+    protected $registry;
 
-    public function __construct(EntityManager $em)
+    public function __construct(RegistryInterface $registry)
     {
-        $this->em = $em;
+        $this->registry = $registry;
     }
 
     protected function loadTypes()
     {
         return array(
-            new Type\EntityType($this->em),
+            new Type\EntityType($this->registry),
         );
     }
 
     protected function loadTypeGuesser()
     {
-        return new DoctrineOrmTypeGuesser($this->em);
+        return new DoctrineOrmTypeGuesser($this->registry);
     }
 }

+ 71 - 131
src/Symfony/Bridge/Doctrine/Form/DoctrineOrmTypeGuesser.php

@@ -15,29 +15,18 @@ use Symfony\Component\Form\FormTypeGuesserInterface;
 use Symfony\Component\Form\Guess\Guess;
 use Symfony\Component\Form\Guess\TypeGuess;
 use Symfony\Component\Form\Guess\ValueGuess;
-use Doctrine\ORM\EntityManager;
+use Symfony\Bridge\Doctrine\RegistryInterface;
 
 class DoctrineOrmTypeGuesser implements FormTypeGuesserInterface
 {
-    /**
-     * The Doctrine 2 entity manager
-     * @var Doctrine\ORM\EntityManager
-     */
-    protected $em = null;
+    protected $registry;
 
-    public function __construct(EntityManager $em)
-    {
-        $this->em = $em;
-    }
+    private $cache;
 
-    /**
-     * Returns whether Doctrine 2 metadata exists for that class
-     *
-     * @return Boolean
-     */
-    protected function isMappedClass($class)
+    public function __construct(RegistryInterface $registry)
     {
-        return !$this->em->getConfiguration()->getMetadataDriverImpl()->isTransient($class);
+        $this->registry = $registry;
+        $this->cache = array();
     }
 
     /**
@@ -45,94 +34,45 @@ class DoctrineOrmTypeGuesser implements FormTypeGuesserInterface
      */
     public function guessType($class, $property)
     {
-        if ($this->isMappedClass($class)) {
-            $metadata = $this->em->getClassMetadata($class);
-
-            if ($metadata->hasAssociation($property)) {
-                $multiple = $metadata->isCollectionValuedAssociation($property);
-                $mapping = $metadata->getAssociationMapping($property);
-
-                return new TypeGuess(
-                    'entity',
-                    array(
-                        'em' => $this->em,
-                        'class' => $mapping['targetEntity'],
-                        'multiple' => $multiple,
-                    ),
-                    Guess::HIGH_CONFIDENCE
-                );
-            } else {
-                switch ($metadata->getTypeOfField($property))
-                {
-        //            case 'array':
-        //                return new TypeGuess(
-        //                    'Collection',
-        //                    array(),
-        //                    Guess::HIGH_CONFIDENCE
-        //                );
-                    case 'boolean':
-                        return new TypeGuess(
-                            'checkbox',
-                            array(),
-                            Guess::HIGH_CONFIDENCE
-                        );
-                    case 'datetime':
-                    case 'vardatetime':
-                    case 'datetimetz':
-                        return new TypeGuess(
-                            'datetime',
-                            array(),
-                            Guess::HIGH_CONFIDENCE
-                        );
-                    case 'date':
-                        return new TypeGuess(
-                            'date',
-                            array(),
-                            Guess::HIGH_CONFIDENCE
-                        );
-                    case 'decimal':
-                    case 'float':
-                        return new TypeGuess(
-                            'number',
-                            array(),
-                            Guess::MEDIUM_CONFIDENCE
-                        );
-                    case 'integer':
-                    case 'bigint':
-                    case 'smallint':
-                        return new TypeGuess(
-                            'integer',
-                            array(),
-                            Guess::MEDIUM_CONFIDENCE
-                        );
-                    case 'string':
-                        return new TypeGuess(
-                            'text',
-                            array(),
-                            Guess::MEDIUM_CONFIDENCE
-                        );
-                    case 'text':
-                        return new TypeGuess(
-                            'textarea',
-                            array(),
-                            Guess::MEDIUM_CONFIDENCE
-                        );
-                    case 'time':
-                        return new TypeGuess(
-                            'time',
-                            array(),
-                            Guess::HIGH_CONFIDENCE
-                        );
-    //                case 'object': ???
-                }
-            }
+        if (!$metadata = $this->getMetadata($class)) {
+            return new TypeGuess('text', array(), Guess::LOW_CONFIDENCE);
         }
 
-        return new TypeGuess(
-            'text',
-            array(),
-            Guess::LOW_CONFIDENCE
-        );
+        if ($metadata->hasAssociation($property)) {
+            $multiple = $metadata->isCollectionValuedAssociation($property);
+            $mapping = $metadata->getAssociationMapping($property);
+
+            return new TypeGuess('entity', array('em' => $this->em, 'class' => $mapping['targetEntity'], 'multiple' => $multiple), Guess::HIGH_CONFIDENCE);
+        }
+
+        switch ($metadata->getTypeOfField($property))
+        {
+            //case 'array':
+            //  return new TypeGuess('Collection', array(), Guess::HIGH_CONFIDENCE);
+            case 'boolean':
+                return new TypeGuess('checkbox', array(), Guess::HIGH_CONFIDENCE);
+            case 'datetime':
+            case 'vardatetime':
+            case 'datetimetz':
+                return new TypeGuess('datetime', array(), Guess::HIGH_CONFIDENCE);
+            case 'date':
+                return new TypeGuess('date', array(), Guess::HIGH_CONFIDENCE);
+            case 'decimal':
+            case 'float':
+                return new TypeGuess('number', array(), Guess::MEDIUM_CONFIDENCE);
+            case 'integer':
+            case 'bigint':
+            case 'smallint':
+                return new TypeGuess('integer', array(), Guess::MEDIUM_CONFIDENCE);
+            case 'string':
+                return new TypeGuess('text', array(), Guess::MEDIUM_CONFIDENCE);
+            case 'text':
+                return new TypeGuess('textarea', array(), Guess::MEDIUM_CONFIDENCE);
+            case 'time':
+                return new TypeGuess('time', array(), Guess::HIGH_CONFIDENCE);
+            default:
+                return new TypeGuess('text', array(), Guess::LOW_CONFIDENCE);
+        }
     }
 
     /**
@@ -140,22 +80,12 @@ class DoctrineOrmTypeGuesser implements FormTypeGuesserInterface
      */
     public function guessRequired($class, $property)
     {
-        if ($this->isMappedClass($class)) {
-            $metadata = $this->em->getClassMetadata($class);
-
-            if ($metadata->hasField($property)) {
-                if (!$metadata->isNullable($property)) {
-                    return new ValueGuess(
-                        true,
-                        Guess::HIGH_CONFIDENCE
-                    );
-                }
-
-                return new ValueGuess(
-                    false,
-                    Guess::MEDIUM_CONFIDENCE
-                );
+        if ($metadata = $this->getMetadata($class) && $metadata->hasField($property)) {
+            if (!$metadata->isNullable($property)) {
+                return new ValueGuess(true, Guess::HIGH_CONFIDENCE);
             }
+
+            return new ValueGuess(false, Guess::MEDIUM_CONFIDENCE);
         }
     }
 
@@ -164,19 +94,11 @@ class DoctrineOrmTypeGuesser implements FormTypeGuesserInterface
      */
     public function guessMaxLength($class, $property)
     {
-        if ($this->isMappedClass($class)) {
-            $metadata = $this->em->getClassMetadata($class);
+        if ($metadata = $this->getMetadata($class) && !$metadata->hasAssociation($property)) {
+            $mapping = $metadata->getFieldMapping($property);
 
-            if (!$metadata->hasAssociation($property)) {
-                $mapping = $metadata->getFieldMapping($property);
-
-
-                if (isset($mapping['length'])) {
-                    return new ValueGuess(
-                        $mapping['length'],
-                        Guess::HIGH_CONFIDENCE
-                    );
-                }
+            if (isset($mapping['length'])) {
+                return new ValueGuess($mapping['length'], Guess::HIGH_CONFIDENCE);
             }
         }
     }
@@ -186,6 +108,24 @@ class DoctrineOrmTypeGuesser implements FormTypeGuesserInterface
      */
     public function guessMinLength($class, $property)
     {
-        return;
+    }
+
+    /**
+     * Returns whether Doctrine 2 metadata exists for that class
+     *
+     * @return Boolean
+     */
+    protected function getMetadata($class)
+    {
+        if (array_key_exists($class, $this->cache)) {
+            return $this->cache[$class];
+        }
+
+        $this->cache[$class] = null;
+        foreach ($this->registry->getEntityManagers() as $em) {
+            if ($em->getConfiguration()->getMetadataDriverImpl()->isTransient($class)) {
+                return $this->cache[$class] = $em->getClassMetadata($class);
+            }
+        }
     }
 }

+ 7 - 7
src/Symfony/Bridge/Doctrine/Form/Type/EntityType.php

@@ -13,20 +13,20 @@ namespace Symfony\Bridge\Doctrine\Form\Type;
 
 use Symfony\Component\Form\FormBuilder;
 use Symfony\Component\Form\FormFactoryInterface;
+use Symfony\Bridge\Doctrine\RegistryInterface;
 use Symfony\Bridge\Doctrine\Form\ChoiceList\EntityChoiceList;
 use Symfony\Bridge\Doctrine\Form\EventListener\MergeCollectionListener;
 use Symfony\Bridge\Doctrine\Form\DataTransformer\EntitiesToArrayTransformer;
 use Symfony\Bridge\Doctrine\Form\DataTransformer\EntityToIdTransformer;
 use Symfony\Component\Form\AbstractType;
-use Doctrine\ORM\EntityManager;
 
 class EntityType extends AbstractType
 {
-    private $em;
+    protected $registry;
 
-    public function __construct(EntityManager $em)
+    public function __construct(RegistryInterface $registry)
     {
-        $this->em = $em;
+        $this->registry = $registry;
     }
 
     public function buildForm(FormBuilder $builder, array $options)
@@ -46,7 +46,7 @@ class EntityType extends AbstractType
         $defaultOptions = array(
             'multiple'          => false,
             'expanded'          => false,
-            'em'                => $this->em,
+            'em'                => null,
             'class'             => null,
             'property'          => null,
             'query_builder'     => null,
@@ -60,7 +60,7 @@ class EntityType extends AbstractType
 
         if (!isset($options['choice_list'])) {
             $defaultOptions['choice_list'] = new EntityChoiceList(
-                $options['em'],
+                $this->registry->getEntityManager($options['em']),
                 $options['class'],
                 $options['property'],
                 $options['query_builder'],
@@ -80,4 +80,4 @@ class EntityType extends AbstractType
     {
         return 'entity';
     }
-}
+}

+ 127 - 0
src/Symfony/Bridge/Doctrine/RegistryInterface.php

@@ -0,0 +1,127 @@
+<?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\Bridge\Doctrine\RegistryInterface;
+use Doctrine\DBAL\Connection;
+use Doctrine\ORM\Configuration;
+use Doctrine\ORM\ORMException;
+
+/**
+ * References Doctrine connections and entity managers.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+interface RegistryInterface
+{
+    /**
+     * 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.
+     *
+     * @return string The default entity manager name
+     */
+    function getDefaultEntityManagerName();
+
+    /**
+     * Gets a named entity manager.
+     *
+     * @param string $name The entity manager name (null for the default one)
+     *
+     * @return EntityManager
+     */
+    function getEntityManager($name = null);
+
+    /**
+     * Gets an array of all registered entity managers
+     *
+     * @return array An array of EntityManager instances
+     */
+    function getEntityManagers();
+
+    /**
+     * Resets a named entity manager.
+     *
+     * This method is useful when an entity manager has been closed
+     * because of a rollbacked transaction AND when you think that
+     * it makes sense to get a new one to replace the closed one.
+     *
+     * Be warned that you will get a brand new entity manager as
+     * the existing one is not useable anymore. This means that any
+     * other object with a dependency on this entity manager will
+     * hold an obsolete reference. You can inject the registry instead
+     * to avoid this problem.
+     *
+     * @param string $name The entity manager name (null for the default one)
+     *
+     * @return EntityManager
+     */
+    function resetEntityManager($name = null);
+
+    /**
+     * Resolves a registered namespace alias to the full namespace.
+     *
+     * This method looks for the alias in all registered entity managers.
+     *
+     * @param string $alias The alias
+     *
+     * @return string The full namespace
+     *
+     * @see Configuration::getEntityNamespace
+     */
+    function getEntityNamespace($alias);
+
+    /**
+     * Gets all connection names.
+     *
+     * @return array An array of connection names
+     */
+    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);
+}

+ 6 - 6
src/Symfony/Bridge/Doctrine/Validator/Constraints/UniqueEntity.php

@@ -17,7 +17,7 @@ use Symfony\Component\Validator\Exception\UnexpectedTypeException;
 
 /**
  * Constraint for the Unique Entity validator
- * 
+ *
  * @author Benjamin Eberlei <kontakt@beberlei.de>
  */
 class UniqueEntity extends Constraint
@@ -25,12 +25,12 @@ class UniqueEntity extends Constraint
     public $message = 'This value is already used.';
     public $em = null;
     public $fields = array();
-    
+
     public function getRequiredOptions()
     {
         return array('fields');
     }
-    
+
     /**
      * The validator must be defined as a service with this name.
      * 
@@ -40,7 +40,7 @@ class UniqueEntity extends Constraint
     {
         return 'doctrine.orm.validator.unique';
     }
-    
+
     /**
      * {@inheritDoc}
      */
@@ -48,9 +48,9 @@ class UniqueEntity extends Constraint
     {
         return self::CLASS_CONSTRAINT;
     }
-    
+
     public function getDefaultOption()
     {
         return 'fields';
     }
-}
+}

+ 17 - 15
src/Symfony/Bridge/Doctrine/Validator/Constraints/UniqueEntityValidator.php

@@ -11,7 +11,7 @@
 
 namespace Symfony\Bridge\Doctrine\Validator\Constraints;
 
-use Symfony\Bundle\DoctrineBundle\Registry;
+use Symfony\Bridge\Doctrine\RegistryInterface;
 use Symfony\Component\Validator\Constraint;
 use Symfony\Component\Validator\Exception\UnexpectedTypeException;
 use Symfony\Component\Validator\Exception\ConstraintDefinitionException;
@@ -19,24 +19,24 @@ use Symfony\Component\Validator\ConstraintValidator;
 
 /**
  * Unique Entity Validator checks if one or a set of fields contain unique values.
- * 
+ *
  * @author Benjamin Eberlei <kontakt@beberlei.de>
  */
 class UniqueEntityValidator extends ConstraintValidator
 {
     /**
-     * @var Registry
+     * @var RegistryInterface
      */
     private $registry;
-    
+
     /**
-     * @param Registry $registry
+     * @param RegistryInterface $registry
      */
-    public function __construct(Registry $registry)
+    public function __construct(RegistryInterface $registry)
     {
         $this->registry = $registry;
     }
-    
+
     /**
      * @param object $entity
      * @param Constraint $constraint
@@ -47,35 +47,37 @@ class UniqueEntityValidator extends ConstraintValidator
         if (!is_array($constraint->fields) && !is_string($constraint->fields)) {
             throw new UnexpectedTypeException($constraint->fields, 'array');
         }
+
         $fields = (array)$constraint->fields;
+
         if (count($constraint->fields) == 0) {
             throw new ConstraintDefinitionException("At least one field has to specified.");
         }
-        
+
         $em = $this->registry->getEntityManager($constraint->em);
-        
+
         $className = $this->context->getCurrentClass();
         $class = $em->getClassMetadata($className);
-        
+
         $criteria = array();
         foreach ($fields as $fieldName) {
             if (!isset($class->reflFields[$fieldName])) {
                 throw new ConstraintDefinitionException("Only field names mapped by Doctrine can be validated for uniqueness.");
             }
-            
+
             $criteria[$fieldName] = $class->reflFields[$fieldName]->getValue($entity);
         }
-        
+
         $repository = $em->getRepository($className);
         $result = $repository->findBy($criteria);
-        
+
         if (count($result) > 0 && $result[0] !== $entity) {
             $oldPath = $this->context->getPropertyPath();
             $this->context->setPropertyPath( empty($oldPath) ? $fields[0] : $oldPath . "." . $fields[0]);
             $this->context->addViolation($constraint->message, array(), $criteria[$constraint->fields[0]]);
             $this->context->setPropertyPath($oldPath);
         }
-        
+
         return true; // all true, we added the violation already!
     }
-}
+}

+ 3 - 3
src/Symfony/Bundle/DoctrineBundle/CacheWarmer/ProxyCacheWarmer.php

@@ -11,7 +11,7 @@
 
 namespace Symfony\Bundle\DoctrineBundle\CacheWarmer;
 
-use Symfony\Bundle\DoctrineBundle\Registry;
+use Symfony\Bridge\Doctrine\RegistryInterface;
 use Symfony\Component\HttpKernel\CacheWarmer\CacheWarmerInterface;
 
 /**
@@ -29,9 +29,9 @@ class ProxyCacheWarmer implements CacheWarmerInterface
     /**
      * Constructor.
      *
-     * @param Registry $registry The Doctrine registry
+     * @param RegistryInterface $registry A RegistryInterface instance
      */
-    public function __construct(Registry $registry)
+    public function __construct(RegistryInterface $registry)
     {
         $this->registry = $registry;
     }

+ 2 - 2
src/Symfony/Bundle/DoctrineBundle/DataCollector/DoctrineDataCollector.php

@@ -15,7 +15,7 @@ use Symfony\Component\HttpKernel\DataCollector\DataCollector;
 use Symfony\Component\HttpFoundation\Request;
 use Symfony\Component\HttpFoundation\Response;
 use Symfony\Bundle\DoctrineBundle\Logger\DbalLogger;
-use Symfony\Bundle\DoctrineBundle\Registry;
+use Symfony\Bridge\Doctrine\RegistryInterface;
 
 /**
  * DoctrineDataCollector.
@@ -28,7 +28,7 @@ class DoctrineDataCollector extends DataCollector
     private $managers;
     private $logger;
 
-    public function __construct(Registry $registry, DbalLogger $logger = null)
+    public function __construct(RegistryInterface $registry, DbalLogger $logger = null)
     {
         $this->connections = $registry->getConnectionNames();
         $this->managers = $registry->getEntityManagerNames();

+ 3 - 3
src/Symfony/Bundle/DoctrineBundle/Mapping/MetadataFactory.php

@@ -11,7 +11,7 @@
 
 namespace Symfony\Bundle\DoctrineBundle\Mapping;
 
-use Symfony\Bundle\DoctrineBundle\Registry;
+use Symfony\Bridge\Doctrine\RegistryInterface;
 use Symfony\Component\HttpKernel\Bundle\BundleInterface;
 use Doctrine\ORM\Tools\EntityRepositoryGenerator;
 use Doctrine\ORM\Mapping\ClassMetadata;
@@ -31,9 +31,9 @@ class MetadataFactory
     /**
      * Constructor.
      *
-     * @param Registry $registry A Registry instance
+     * @param RegistryInterface $registry A RegistryInterface instance
      */
-    public function __construct(Registry $registry)
+    public function __construct(RegistryInterface $registry)
     {
         $this->registry = $registry;
     }

+ 2 - 2
src/Symfony/Bundle/DoctrineBundle/Registry.php

@@ -12,6 +12,7 @@
 namespace Symfony\Bundle\DoctrineBundle;
 
 use Symfony\Component\DependencyInjection\ContainerInterface;
+use Symfony\Bridge\Doctrine\RegistryInterface;
 use Doctrine\DBAL\Connection;
 use Doctrine\ORM\Configuration;
 use Doctrine\ORM\ORMException;
@@ -21,7 +22,7 @@ use Doctrine\ORM\ORMException;
  *
  * @author Fabien Potencier <fabien@symfony.com>
  */
-class Registry
+class Registry implements RegistryInterface
 {
     private $container;
     private $connections;
@@ -203,7 +204,6 @@ class Registry
         return $this->entityManagers;
     }
 
-
     /**
      * Gets the EntityRepository for an entity.
      *

+ 2 - 2
src/Symfony/Bundle/DoctrineBundle/Resources/config/orm.xml

@@ -49,12 +49,12 @@
 
         <service id="form.type_guesser.doctrine" class="%form.type_guesser.doctrine.class%">
             <tag name="form.type_guesser" />
-            <argument type="service" id="doctrine.orm.entity_manager" />
+            <argument type="service" id="doctrine" />
         </service>
 
         <service id="form.type.entity" class="Symfony\Bridge\Doctrine\Form\Type\EntityType">
             <tag name="form.type" alias="entity" />
-            <argument type="service" id="doctrine.orm.entity_manager" />
+            <argument type="service" id="doctrine" />
         </service>
 
         <service id="doctrine.orm.configuration" class="%doctrine.orm.configuration.class%" abstract="true" public="false" />

+ 1 - 1
tests/Symfony/Tests/Bridge/Doctrine/Form/DoctrineOrmTestCase.php

@@ -32,7 +32,7 @@ abstract class DoctrineOrmTestCase extends \PHPUnit_Framework_TestCase
     /**
      * @return EntityManager
      */
-    public static function createTestEntityManager($paths = array())
+    static public function createTestEntityManager($paths = array())
     {
         $config = new \Doctrine\ORM\Configuration();
         $config->setAutoGenerateProxyClasses(true);

+ 37 - 26
tests/Symfony/Tests/Bridge/Doctrine/Form/Type/EntityTypeTest.php

@@ -70,7 +70,7 @@ class EntityTypeTest extends TypeTestCase
     protected function getExtensions()
     {
         return array_merge(parent::getExtensions(), array(
-            new DoctrineOrmExtension($this->em),
+            new DoctrineOrmExtension($this->createRegistryMock('default', $this->em)),
         ));
     }
 
@@ -93,7 +93,7 @@ class EntityTypeTest extends TypeTestCase
 //        $this->persist(array($entity1, $entity2));
 //
 //        $field = $this->factory->createNamed('entity', 'name', null, array(
-//            'em' => $this->em,
+//            'em' => 'default',
 //            'class' => self::SINGLE_IDENT_CLASS,
 //            'required' => false,
 //            'property' => 'name'
@@ -109,7 +109,7 @@ class EntityTypeTest extends TypeTestCase
     public function testConfigureQueryBuilderWithNonQueryBuilderAndNonClosure()
     {
         $field = $this->factory->createNamed('entity', 'name', null, array(
-            'em' => $this->em,
+            'em' => 'default',
             'class' => self::SINGLE_IDENT_CLASS,
             'query_builder' => new \stdClass(),
         ));
@@ -121,7 +121,7 @@ class EntityTypeTest extends TypeTestCase
     public function testConfigureQueryBuilderWithClosureReturningNonQueryBuilder()
     {
         $field = $this->factory->createNamed('entity', 'name', null, array(
-            'em' => $this->em,
+            'em' => 'default',
             'class' => self::SINGLE_IDENT_CLASS,
             'query_builder' => function () {
                 return new \stdClass();
@@ -135,7 +135,7 @@ class EntityTypeTest extends TypeTestCase
     {
         $field = $this->factory->createNamed('entity', 'name', null, array(
             'multiple' => false,
-            'em' => $this->em,
+            'em' => 'default',
             'class' => self::SINGLE_IDENT_CLASS,
         ));
         $field->setData(null);
@@ -149,7 +149,7 @@ class EntityTypeTest extends TypeTestCase
         $field = $this->factory->createNamed('entity', 'name', null, array(
             'multiple' => true,
             'expanded' => true,
-            'em' => $this->em,
+            'em' => 'default',
             'class' => self::SINGLE_IDENT_CLASS,
         ));
         $field->setData(null);
@@ -163,7 +163,7 @@ class EntityTypeTest extends TypeTestCase
         $field = $this->factory->createNamed('entity', 'name', null, array(
             'multiple' => true,
             'expanded' => false,
-            'em' => $this->em,
+            'em' => 'default',
             'class' => self::SINGLE_IDENT_CLASS,
         ));
         $field->setData(null);
@@ -177,7 +177,7 @@ class EntityTypeTest extends TypeTestCase
         $field = $this->factory->createNamed('entity', 'name', null, array(
             'multiple' => false,
             'expanded' => true,
-            'em' => $this->em,
+            'em' => 'default',
             'class' => self::SINGLE_IDENT_CLASS,
         ));
         $field->bind(null);
@@ -191,7 +191,7 @@ class EntityTypeTest extends TypeTestCase
         $field = $this->factory->createNamed('entity', 'name', null, array(
             'multiple' => false,
             'expanded' => false,
-            'em' => $this->em,
+            'em' => 'default',
             'class' => self::SINGLE_IDENT_CLASS,
         ));
         $field->bind(null);
@@ -204,7 +204,7 @@ class EntityTypeTest extends TypeTestCase
     {
         $field = $this->factory->createNamed('entity', 'name', null, array(
             'multiple' => true,
-            'em' => $this->em,
+            'em' => 'default',
             'class' => self::SINGLE_IDENT_CLASS,
         ));
         $field->bind(null);
@@ -223,7 +223,7 @@ class EntityTypeTest extends TypeTestCase
         $field = $this->factory->createNamed('entity', 'name', null, array(
             'multiple' => false,
             'expanded' => false,
-            'em' => $this->em,
+            'em' => 'default',
             'class' => self::SINGLE_IDENT_CLASS,
             'property' => 'name',
         ));
@@ -245,7 +245,7 @@ class EntityTypeTest extends TypeTestCase
         $field = $this->factory->createNamed('entity', 'name', null, array(
             'multiple' => false,
             'expanded' => false,
-            'em' => $this->em,
+            'em' => 'default',
             'class' => self::COMPOSITE_IDENT_CLASS,
             'property' => 'name',
         ));
@@ -269,7 +269,7 @@ class EntityTypeTest extends TypeTestCase
         $field = $this->factory->createNamed('entity', 'name', null, array(
             'multiple' => true,
             'expanded' => false,
-            'em' => $this->em,
+            'em' => 'default',
             'class' => self::SINGLE_IDENT_CLASS,
             'property' => 'name',
         ));
@@ -294,7 +294,7 @@ class EntityTypeTest extends TypeTestCase
         $field = $this->factory->createNamed('entity', 'name', null, array(
             'multiple' => true,
             'expanded' => false,
-            'em' => $this->em,
+            'em' => 'default',
             'class' => self::SINGLE_IDENT_CLASS,
             'property' => 'name',
         ));
@@ -325,7 +325,7 @@ class EntityTypeTest extends TypeTestCase
         $field = $this->factory->createNamed('entity', 'name', null, array(
             'multiple' => true,
             'expanded' => false,
-            'em' => $this->em,
+            'em' => 'default',
             'class' => self::COMPOSITE_IDENT_CLASS,
             'property' => 'name',
         ));
@@ -351,7 +351,7 @@ class EntityTypeTest extends TypeTestCase
         $field = $this->factory->createNamed('entity', 'name', null, array(
             'multiple' => true,
             'expanded' => false,
-            'em' => $this->em,
+            'em' => 'default',
             'class' => self::COMPOSITE_IDENT_CLASS,
             'property' => 'name',
         ));
@@ -381,7 +381,7 @@ class EntityTypeTest extends TypeTestCase
         $field = $this->factory->createNamed('entity', 'name', null, array(
             'multiple' => false,
             'expanded' => true,
-            'em' => $this->em,
+            'em' => 'default',
             'class' => self::SINGLE_IDENT_CLASS,
             'property' => 'name',
         ));
@@ -407,7 +407,7 @@ class EntityTypeTest extends TypeTestCase
         $field = $this->factory->createNamed('entity', 'name', null, array(
             'multiple' => true,
             'expanded' => true,
-            'em' => $this->em,
+            'em' => 'default',
             'class' => self::SINGLE_IDENT_CLASS,
             'property' => 'name',
         ));
@@ -437,7 +437,7 @@ class EntityTypeTest extends TypeTestCase
         $this->persist(array($entity1, $entity2, $entity3));
 
         $field = $this->factory->createNamed('entity', 'name', null, array(
-            'em' => $this->em,
+            'em' => 'default',
             'class' => self::SINGLE_IDENT_CLASS,
             // not all persisted entities should be displayed
             'choices' => array($entity1, $entity2),
@@ -461,7 +461,7 @@ class EntityTypeTest extends TypeTestCase
         $this->persist(array($entity1, $entity2, $entity3));
 
         $field = $this->factory->createNamed('entity', 'name', null, array(
-            'em' => $this->em,
+            'em' => 'default',
             'class' => self::SINGLE_IDENT_CLASS,
             'choices' => array($entity1, $entity2),
             'property' => 'name',
@@ -482,7 +482,7 @@ class EntityTypeTest extends TypeTestCase
         $this->persist(array($entity1, $entity2, $entity3));
 
         $field = $this->factory->createNamed('entity', 'name', null, array(
-            'em' => $this->em,
+            'em' => 'default',
             'class' => self::COMPOSITE_IDENT_CLASS,
             'choices' => array($entity1, $entity2),
             'property' => 'name',
@@ -505,7 +505,7 @@ class EntityTypeTest extends TypeTestCase
         $repository = $this->em->getRepository(self::SINGLE_IDENT_CLASS);
 
         $field = $this->factory->createNamed('entity', 'name', null, array(
-            'em' => $this->em,
+            'em' => 'default',
             'class' => self::SINGLE_IDENT_CLASS,
             'query_builder' => $repository->createQueryBuilder('e')
                 ->where('e.id IN (1, 2)'),
@@ -527,7 +527,7 @@ class EntityTypeTest extends TypeTestCase
         $this->persist(array($entity1, $entity2, $entity3));
 
         $field = $this->factory->createNamed('entity', 'name', null, array(
-            'em' => $this->em,
+            'em' => 'default',
             'class' => self::SINGLE_IDENT_CLASS,
             'query_builder' => function ($repository) {
                 return $repository->createQueryBuilder('e')
@@ -551,7 +551,7 @@ class EntityTypeTest extends TypeTestCase
         $this->persist(array($entity1, $entity2, $entity3));
 
         $field = $this->factory->createNamed('entity', 'name', null, array(
-            'em' => $this->em,
+            'em' => 'default',
             'class' => self::COMPOSITE_IDENT_CLASS,
             'query_builder' => function ($repository) {
                 return $repository->createQueryBuilder('e')
@@ -575,7 +575,7 @@ class EntityTypeTest extends TypeTestCase
         $field = $this->factory->createNamed('entity', 'name', null, array(
             'multiple' => false,
             'expanded' => false,
-            'em' => $this->em,
+            'em' => 'default',
             'class' => self::SINGLE_STRING_IDENT_CLASS,
             'property' => 'name',
         ));
@@ -596,7 +596,7 @@ class EntityTypeTest extends TypeTestCase
         $field = $this->factory->createNamed('entity', 'name', null, array(
             'multiple' => false,
             'expanded' => false,
-            'em' => $this->em,
+            'em' => 'default',
             'class' => self::COMPOSITE_STRING_IDENT_CLASS,
             'property' => 'name',
         ));
@@ -608,4 +608,15 @@ class EntityTypeTest extends TypeTestCase
         $this->assertEquals($entity1, $field->getData());
         $this->assertEquals(0, $field->getClientData());
     }
+
+    protected function createRegistryMock($name, $em)
+    {
+        $registry = $this->getMock('Symfony\Bridge\Doctrine\RegistryInterface');
+        $registry->expects($this->any())
+                 ->method('getEntityManager')
+                 ->with($this->equalTo($name))
+                 ->will($this->returnValue($em));
+
+        return $registry;
+    }
 }

+ 20 - 17
tests/Symfony/Tests/Bridge/Doctrine/Validator/Constraints/UniqueValidatorTest.php

@@ -27,14 +27,15 @@ class UniqueValidatorTest extends DoctrineOrmTestCase
 {
     protected function createRegistryMock($entityManagerName, $em)
     {
-        $registry = $this->getMock('Symfony\Bundle\DoctrineBundle\Registry', array(), array(), '', false);
+        $registry = $this->getMock('Symfony\Bridge\Doctrine\RegistryInterface');
         $registry->expects($this->any())
                  ->method('getEntityManager')
                  ->with($this->equalTo($entityManagerName))
                  ->will($this->returnValue($em));
+
         return $registry;
     }
-    
+
     protected function createMetadataFactoryMock($metadata)
     {
         $metadataFactory = $this->getMock('Symfony\Component\Validator\Mapping\ClassMetadataFactoryInterface');
@@ -42,9 +43,10 @@ class UniqueValidatorTest extends DoctrineOrmTestCase
                         ->method('getClassMetadata')
                         ->with($this->equalTo($metadata->name))
                         ->will($this->returnValue($metadata));
+
         return $metadataFactory;
     }
-    
+
     protected function createValidatorFactory($uniqueValidator)
     {
         $validatorFactory = $this->getMock('Symfony\Component\Validator\ConstraintValidatorFactoryInterface');
@@ -52,9 +54,10 @@ class UniqueValidatorTest extends DoctrineOrmTestCase
                          ->method('getInstance')
                          ->with($this->isInstanceOf('Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity'))
                          ->will($this->returnValue($uniqueValidator));
+
         return $validatorFactory;
     }
-    
+
     /**
      * This is a functinoal test as there is a large integration necessary to get the validator working.
      */
@@ -66,38 +69,38 @@ class UniqueValidatorTest extends DoctrineOrmTestCase
         $schemaTool->createSchema(array(
             $em->getClassMetadata('Symfony\Tests\Bridge\Doctrine\Form\Fixtures\SingleIdentEntity')
         ));
-        
+
         $entity1 = new SingleIdentEntity(1, 'Foo');
-        
+
         $registry = $this->createRegistryMock($entityManagerName, $em);
-        
+
         $uniqueValidator = new UniqueEntityValidator($registry);
-        
+
         $metadata = new ClassMetadata('Symfony\Tests\Bridge\Doctrine\Form\Fixtures\SingleIdentEntity');
         $metadata->addConstraint(new UniqueEntity(array('fields' => array('name'), 'em' => $entityManagerName)));
-        
+
         $metadataFactory = $this->createMetadataFactoryMock($metadata);
         $validatorFactory = $this->createValidatorFactory($uniqueValidator);
-        
+
         $validator = new Validator($metadataFactory, $validatorFactory);
-        
+
         $violationsList = $validator->validate($entity1);
         $this->assertEquals(0, $violationsList->count(), "No violations found on entity before it is saved to the database.");
-        
+
         $em->persist($entity1);
         $em->flush();
-        
+
         $violationsList = $validator->validate($entity1);
         $this->assertEquals(0, $violationsList->count(), "No violations found on entity after it was saved to the database.");
-        
+
         $entity2 = new SingleIdentEntity(2, 'Foo');
-        
+
         $violationsList = $validator->validate($entity2);
         $this->assertEquals(1, $violationsList->count(), "No violations found on entity after it was saved to the database.");
-        
+
         $violation = $violationsList[0];
         $this->assertEquals('This value is already used.', $violation->getMessage());
         $this->assertEquals('name', $violation->getPropertyPath());
         $this->assertEquals('Foo', $violation->getInvalidValue());
     }
-}
+}