[DoctrineBridge] optimized DoctrineChoiceLoader
This commit is contained in:
parent
cef7e5b1b0
commit
86b2ff112d
@ -12,6 +12,7 @@
|
||||
namespace Symfony\Bridge\Doctrine\Form\ChoiceList;
|
||||
|
||||
use Doctrine\Common\Persistence\ObjectManager;
|
||||
use Symfony\Component\Form\ChoiceList\ArrayChoiceList;
|
||||
use Symfony\Component\Form\ChoiceList\ChoiceListInterface;
|
||||
use Symfony\Component\Form\ChoiceList\Factory\ChoiceListFactoryInterface;
|
||||
use Symfony\Component\Form\ChoiceList\Loader\ChoiceLoaderInterface;
|
||||
@ -60,20 +61,31 @@ class DoctrineChoiceLoader implements ChoiceLoaderInterface
|
||||
* passed which optimizes the object loading for one of the Doctrine
|
||||
* mapper implementations.
|
||||
*
|
||||
* @param ChoiceListFactoryInterface $factory The factory for creating
|
||||
* the loaded choice list
|
||||
* @param ObjectManager $manager The object manager
|
||||
* @param string $class The class name of the
|
||||
* loaded objects
|
||||
* @param IdReader $idReader The reader for the object
|
||||
* IDs.
|
||||
* @param ChoiceListFactoryInterface $factory The factory for creating
|
||||
* the loaded choice list
|
||||
* @param null|EntityLoaderInterface $objectLoader The objects loader
|
||||
*/
|
||||
public function __construct(ChoiceListFactoryInterface $factory, ObjectManager $manager, $class, IdReader $idReader = null, EntityLoaderInterface $objectLoader = null)
|
||||
public function __construct($manager, $class, $idReader = null, $objectLoader = null, $factory = null)
|
||||
{
|
||||
// BC to be removed and replace with type hints in 4.0
|
||||
if ($manager instanceof ChoiceListFactoryInterface) {
|
||||
@trigger_error(sprintf('Passing a ChoiceListFactoryInterface to %s is deprecated since version 3.1 and will no longer be supported in 4.0. You should either call "%s::loadChoiceList" or override it to return a ChoiceListInterface.', __CLASS__, __CLASS__));
|
||||
|
||||
// Provide a BC layer since $factory has changed
|
||||
// form first to last argument as of 3.1
|
||||
$this->factory = $manager;
|
||||
$manager = $class;
|
||||
$class = $idReader;
|
||||
$objectLoader = $factory;
|
||||
}
|
||||
|
||||
$classMetadata = $manager->getClassMetadata($class);
|
||||
|
||||
$this->factory = $factory;
|
||||
$this->manager = $manager;
|
||||
$this->class = $classMetadata->getName();
|
||||
$this->idReader = $idReader ?: new IdReader($manager, $classMetadata);
|
||||
@ -93,9 +105,7 @@ class DoctrineChoiceLoader implements ChoiceLoaderInterface
|
||||
? $this->objectLoader->getEntities()
|
||||
: $this->manager->getRepository($this->class)->findAll();
|
||||
|
||||
$this->choiceList = $this->factory->createListFromChoices($objects, $value);
|
||||
|
||||
return $this->choiceList;
|
||||
return $this->choiceList = new ArrayChoiceList($objects, $value);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -146,7 +156,7 @@ class DoctrineChoiceLoader implements ChoiceLoaderInterface
|
||||
|
||||
// Optimize performance in case we have an object loader and
|
||||
// a single-field identifier
|
||||
$optimize = null === $value || is_array($value) && $value[0] === $this->idReader;
|
||||
$optimize = null === $value || is_array($value) && $this->idReader === $value[0];
|
||||
|
||||
if ($optimize && !$this->choiceList && $this->objectLoader && $this->idReader->isSingleId()) {
|
||||
$unorderedObjects = $this->objectLoader->getEntitiesByIds($this->idReader->getIdField(), $values);
|
||||
|
@ -160,7 +160,6 @@ abstract class DoctrineType extends AbstractType
|
||||
}
|
||||
|
||||
$doctrineChoiceLoader = new DoctrineChoiceLoader(
|
||||
$this->choiceListFactory,
|
||||
$options['em'],
|
||||
$options['class'],
|
||||
$options['id_reader'],
|
||||
|
Reference in New Issue
Block a user