From 2ca753bc686881f170f74f789cf5f392e425991d Mon Sep 17 00:00:00 2001 From: Bernhard Schussek Date: Fri, 13 Jul 2012 14:48:51 +0200 Subject: [PATCH] [Form] Fixed choice list hashing in DoctrineType --- .../Doctrine/Form/Type/DoctrineType.php | 35 +++++++++++++++---- 1 file changed, 29 insertions(+), 6 deletions(-) diff --git a/src/Symfony/Bridge/Doctrine/Form/Type/DoctrineType.php b/src/Symfony/Bridge/Doctrine/Form/Type/DoctrineType.php index 6f4433f4dcc0..31216ea3196c 100644 --- a/src/Symfony/Bridge/Doctrine/Form/Type/DoctrineType.php +++ b/src/Symfony/Bridge/Doctrine/Form/Type/DoctrineType.php @@ -68,17 +68,40 @@ public function setDefaultOptions(OptionsResolverInterface $resolver) $choiceList = function (Options $options) use ($registry, &$choiceListCache, &$time) { $manager = $registry->getManager($options['em']); - $choiceHashes = is_array($options['choices']) - ? array_map('spl_object_hash', $options['choices']) - : $options['choices']; + // Support for closures + $propertyHash = is_object($options['property']) + ? spl_object_hash($options['property']) + : $options['property']; + + $choiceHashes = $options['choices']; + + // Support for recursive arrays + if (is_array($choiceHashes)) { + // A second parameter ($key) is passed, so we cannot use + // spl_object_hash() directly (which strictly requires + // one parameter) + array_walk_recursive($choiceHashes, function ($value) { + return spl_object_hash($value); + }); + } + + // Support for custom loaders (with query builders) + $loaderHash = is_object($options['loader']) + ? spl_object_hash($options['loader']) + : $options['loader']; + + // Support for closures + $groupByHash = is_object($options['group_by']) + ? spl_object_hash($options['group_by']) + : $options['group_by']; $hash = md5(json_encode(array( spl_object_hash($manager), $options['class'], - $options['property'], - $options['loader'], + $propertyHash, + $loaderHash, $choiceHashes, - $options['group_by'] + $groupByHash ))); if (!isset($choiceListCache[$hash])) {