diff --git a/.travis.yml b/.travis.yml
index dc430278dc..1b195b21d7 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -30,7 +30,7 @@ services: mongodb
before_install:
- if [[ ! $deps && ! $TRAVIS_PHP_VERSION = ${MIN_PHP%.*} && $TRAVIS_PHP_VERSION != hhvm && $TRAVIS_PULL_REQUEST != false ]]; then deps=skip; fi;
- - if [[ ! $deps && ! -d php-$MIN_PHP/sapi ]]; then wget http://museum.php.net/php5/php-$MIN_PHP.tar.bz2 -O - | tar -xj; (cd php-$MIN_PHP; ./configure --enable-sigchild --enable-pcntl; make -j2); fi;
+ - if [[ ! $deps && $TRAVIS_PHP_VERSION = ${MIN_PHP%.*} && ! -d php-$MIN_PHP/sapi ]]; then wget http://museum.php.net/php5/php-$MIN_PHP.tar.bz2 -O - | tar -xj; (cd php-$MIN_PHP; ./configure --enable-sigchild --enable-pcntl; make -j2); fi;
- if [[ $TRAVIS_PHP_VERSION != hhvm ]]; then INI_FILE=~/.phpenv/versions/$(phpenv version-name)/etc/conf.d/travis.ini; else INI_FILE=/etc/hhvm/php.ini; fi;
- echo memory_limit = -1 >> $INI_FILE
- echo session.gc_probability = 0 >> $INI_FILE
diff --git a/src/Symfony/Bridge/Doctrine/Form/Type/DoctrineType.php b/src/Symfony/Bridge/Doctrine/Form/Type/DoctrineType.php
index 353c185287..9b3c50307c 100644
--- a/src/Symfony/Bridge/Doctrine/Form/Type/DoctrineType.php
+++ b/src/Symfony/Bridge/Doctrine/Form/Type/DoctrineType.php
@@ -111,7 +111,12 @@ abstract class DoctrineType extends AbstractType
public function __construct(ManagerRegistry $registry, PropertyAccessorInterface $propertyAccessor = null, ChoiceListFactoryInterface $choiceListFactory = null)
{
$this->registry = $registry;
- $this->choiceListFactory = $choiceListFactory ?: new PropertyAccessDecorator(new DefaultChoiceListFactory(), $propertyAccessor);
+ $this->choiceListFactory = $choiceListFactory ?: new CachingFactoryDecorator(
+ new PropertyAccessDecorator(
+ new DefaultChoiceListFactory(),
+ $propertyAccessor
+ )
+ );
}
public function buildForm(FormBuilderInterface $builder, array $options)
diff --git a/src/Symfony/Bridge/Doctrine/Form/Type/EntityType.php b/src/Symfony/Bridge/Doctrine/Form/Type/EntityType.php
index f0c8a9e785..21f1860efd 100644
--- a/src/Symfony/Bridge/Doctrine/Form/Type/EntityType.php
+++ b/src/Symfony/Bridge/Doctrine/Form/Type/EntityType.php
@@ -12,6 +12,7 @@
namespace Symfony\Bridge\Doctrine\Form\Type;
use Doctrine\Common\Persistence\ObjectManager;
+use Doctrine\ORM\Query\Parameter;
use Doctrine\ORM\QueryBuilder;
use Symfony\Bridge\Doctrine\Form\ChoiceList\ORMQueryBuilderLoader;
use Symfony\Component\Form\Exception\UnexpectedTypeException;
@@ -78,8 +79,20 @@ class EntityType extends DoctrineType
public function getQueryBuilderPartsForCachingHash($queryBuilder)
{
return array(
- $queryBuilder->getQuery()->getSQL(),
- $queryBuilder->getParameters()->toArray(),
+ $queryBuilder->getQuery()->getSQL(),
+ array_map(array($this, 'parameterToArray'), $queryBuilder->getParameters()->toArray()),
);
}
+
+ /**
+ * Converts a query parameter to an array.
+ *
+ * @param Parameter $parameter The query parameter
+ *
+ * @return array The array representation of the parameter
+ */
+ private function parameterToArray(Parameter $parameter)
+ {
+ return array($parameter->getName(), $parameter->getType(), $parameter->getValue());
+ }
}
diff --git a/src/Symfony/Bridge/Doctrine/Tests/Form/Type/EntityTypeTest.php b/src/Symfony/Bridge/Doctrine/Tests/Form/Type/EntityTypeTest.php
index d090fd604f..0303c355c0 100644
--- a/src/Symfony/Bridge/Doctrine/Tests/Form/Type/EntityTypeTest.php
+++ b/src/Symfony/Bridge/Doctrine/Tests/Form/Type/EntityTypeTest.php
@@ -1127,6 +1127,69 @@ class EntityTypeTest extends TypeTestCase
$this->assertSame($choiceLoader1, $choiceLoader3);
}
+ public function testLoaderCachingWithParameters()
+ {
+ $entity1 = new SingleIntIdEntity(1, 'Foo');
+ $entity2 = new SingleIntIdEntity(2, 'Bar');
+ $entity3 = new SingleIntIdEntity(3, 'Baz');
+
+ $this->persist(array($entity1, $entity2, $entity3));
+
+ $repo = $this->em->getRepository(self::SINGLE_IDENT_CLASS);
+
+ $entityType = new EntityType(
+ $this->emRegistry,
+ PropertyAccess::createPropertyAccessor()
+ );
+
+ $entityTypeGuesser = new DoctrineOrmTypeGuesser($this->emRegistry);
+
+ $factory = Forms::createFormFactoryBuilder()
+ ->addType($entityType)
+ ->addTypeGuesser($entityTypeGuesser)
+ ->getFormFactory();
+
+ $formBuilder = $factory->createNamedBuilder('form', 'Symfony\Component\Form\Extension\Core\Type\FormType');
+
+ $formBuilder->add('property1', 'Symfony\Bridge\Doctrine\Form\Type\EntityType', array(
+ 'em' => 'default',
+ 'class' => self::SINGLE_IDENT_CLASS,
+ 'query_builder' => $repo->createQueryBuilder('e')->where('e.id = :id')->setParameter('id', 1),
+ ));
+
+ $formBuilder->add('property2', 'Symfony\Bridge\Doctrine\Form\Type\EntityType', array(
+ 'em' => 'default',
+ 'class' => self::SINGLE_IDENT_CLASS,
+ 'query_builder' => function (EntityRepository $repo) {
+ return $repo->createQueryBuilder('e')->where('e.id = :id')->setParameter('id', 1);
+ },
+ ));
+
+ $formBuilder->add('property3', 'Symfony\Bridge\Doctrine\Form\Type\EntityType', array(
+ 'em' => 'default',
+ 'class' => self::SINGLE_IDENT_CLASS,
+ 'query_builder' => function (EntityRepository $repo) {
+ return $repo->createQueryBuilder('e')->where('e.id = :id')->setParameter('id', 1);
+ },
+ ));
+
+ $form = $formBuilder->getForm();
+
+ $form->submit(array(
+ 'property1' => 1,
+ 'property2' => 1,
+ 'property3' => 2,
+ ));
+
+ $choiceLoader1 = $form->get('property1')->getConfig()->getOption('choice_loader');
+ $choiceLoader2 = $form->get('property2')->getConfig()->getOption('choice_loader');
+ $choiceLoader3 = $form->get('property3')->getConfig()->getOption('choice_loader');
+
+ $this->assertInstanceOf('Symfony\Component\Form\ChoiceList\Loader\ChoiceLoaderInterface', $choiceLoader1);
+ $this->assertSame($choiceLoader1, $choiceLoader2);
+ $this->assertSame($choiceLoader1, $choiceLoader3);
+ }
+
protected function createRegistryMock($name, $em)
{
$registry = $this->getMock('Doctrine\Common\Persistence\ManagerRegistry');
diff --git a/src/Symfony/Bundle/FrameworkBundle/Resources/config/form.xml b/src/Symfony/Bundle/FrameworkBundle/Resources/config/form.xml
index 5d74391119..edbd0d64b8 100644
--- a/src/Symfony/Bundle/FrameworkBundle/Resources/config/form.xml
+++ b/src/Symfony/Bundle/FrameworkBundle/Resources/config/form.xml
@@ -48,6 +48,19 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -60,6 +73,7 @@
+
diff --git a/src/Symfony/Bundle/WebProfilerBundle/Controller/ProfilerController.php b/src/Symfony/Bundle/WebProfilerBundle/Controller/ProfilerController.php
index a5590c17df..ba8a946332 100644
--- a/src/Symfony/Bundle/WebProfilerBundle/Controller/ProfilerController.php
+++ b/src/Symfony/Bundle/WebProfilerBundle/Controller/ProfilerController.php
@@ -286,7 +286,6 @@ class ProfilerController
'end' => $end,
'limit' => $limit,
'panel' => null,
- 'request' => $request,
)), 200, array('Content-Type' => 'text/html'));
}
@@ -332,7 +331,6 @@ class ProfilerController
$tokens = $this->profiler->find($ip, $url, $limit, $method, $start, $end);
return new RedirectResponse($this->generator->generate('_profiler_search_results', array(
- 'request' => $request,
'token' => $tokens ? $tokens[0]['token'] : 'empty',
'ip' => $ip,
'method' => $method,
diff --git a/src/Symfony/Component/Form/Extension/Core/Type/ChoiceType.php b/src/Symfony/Component/Form/Extension/Core/Type/ChoiceType.php
index f394db37b3..5e5d3374fd 100644
--- a/src/Symfony/Component/Form/Extension/Core/Type/ChoiceType.php
+++ b/src/Symfony/Component/Form/Extension/Core/Type/ChoiceType.php
@@ -12,6 +12,7 @@
namespace Symfony\Component\Form\Extension\Core\Type;
use Symfony\Component\Form\AbstractType;
+use Symfony\Component\Form\ChoiceList\Factory\CachingFactoryDecorator;
use Symfony\Component\Form\ChoiceList\Factory\PropertyAccessDecorator;
use Symfony\Component\Form\ChoiceList\View\ChoiceGroupView;
use Symfony\Component\Form\ChoiceList\ChoiceListInterface;
@@ -44,7 +45,11 @@ class ChoiceType extends AbstractType
public function __construct(ChoiceListFactoryInterface $choiceListFactory = null)
{
- $this->choiceListFactory = $choiceListFactory ?: new PropertyAccessDecorator(new DefaultChoiceListFactory());
+ $this->choiceListFactory = $choiceListFactory ?: new CachingFactoryDecorator(
+ new PropertyAccessDecorator(
+ new DefaultChoiceListFactory()
+ )
+ );
}
/**
diff --git a/src/Symfony/Component/Process/Tests/ExecutableFinderTest.php b/src/Symfony/Component/Process/Tests/ExecutableFinderTest.php
index dccb97c30d..b4341fbd5d 100644
--- a/src/Symfony/Component/Process/Tests/ExecutableFinderTest.php
+++ b/src/Symfony/Component/Process/Tests/ExecutableFinderTest.php
@@ -90,7 +90,7 @@ class ExecutableFinderTest extends \PHPUnit_Framework_TestCase
$this->markTestSkipped('Cannot test when open_basedir is set');
}
- $this->iniSet('open_basedir', dirname(PHP_BINARY).(!defined('HHVM_VERSION') ? PATH_SEPARATOR.'/' : ''));
+ $this->iniSet('open_basedir', dirname(PHP_BINARY).(!defined('HHVM_VERSION') || HHVM_VERSION_ID >= 30800 ? PATH_SEPARATOR.'/' : ''));
$finder = new ExecutableFinder();
$result = $finder->find($this->getPhpBinaryName());
@@ -108,7 +108,7 @@ class ExecutableFinderTest extends \PHPUnit_Framework_TestCase
}
$this->setPath('');
- $this->iniSet('open_basedir', PHP_BINARY.(!defined('HHVM_VERSION') ? PATH_SEPARATOR.'/' : ''));
+ $this->iniSet('open_basedir', PHP_BINARY.(!defined('HHVM_VERSION') || HHVM_VERSION_ID >= 30800 ? PATH_SEPARATOR.'/' : ''));
$finder = new ExecutableFinder();
$result = $finder->find($this->getPhpBinaryName(), false);