From 50bb84d06bc8b437000a1d21db83b6cc4b951fd2 Mon Sep 17 00:00:00 2001 From: Bernhard Schussek Date: Tue, 11 Mar 2014 14:45:21 +0100 Subject: [PATCH] [Validator] Optimized RecursiveContextualValidator --- .../NodeVisitor/NodeValidationVisitor.php | 16 ++++++------- .../RecursiveContextualValidator.php | 23 +++++++++---------- 2 files changed, 19 insertions(+), 20 deletions(-) diff --git a/src/Symfony/Component/Validator/NodeVisitor/NodeValidationVisitor.php b/src/Symfony/Component/Validator/NodeVisitor/NodeValidationVisitor.php index 9d18c7ef48..65e9bcc788 100644 --- a/src/Symfony/Component/Validator/NodeVisitor/NodeValidationVisitor.php +++ b/src/Symfony/Component/Validator/NodeVisitor/NodeValidationVisitor.php @@ -103,18 +103,18 @@ class NodeValidationVisitor extends AbstractVisitor $context->markObjectAsValidatedForGroup($objectHash, $groupHash); } - // Validate normal group - if (!$group instanceof GroupSequence) { - $this->validateNodeForGroup($node, $group, $context, $objectHash); + if ($group instanceof GroupSequence) { + // Traverse group sequence until a violation is generated + $this->traverseGroupSequence($node, $group, $context); + + // Skip the group sequence when validating successor nodes + unset($node->groups[$key]); continue; } - // Traverse group sequence until a violation is generated - $this->traverseGroupSequence($node, $group, $context); - - // Skip the group sequence when validating successor nodes - unset($node->groups[$key]); + // Validate normal group + $this->validateNodeForGroup($node, $group, $context, $objectHash); } return true; diff --git a/src/Symfony/Component/Validator/Validator/RecursiveContextualValidator.php b/src/Symfony/Component/Validator/Validator/RecursiveContextualValidator.php index 69b29a1c1c..e3872b4232 100644 --- a/src/Symfony/Component/Validator/Validator/RecursiveContextualValidator.php +++ b/src/Symfony/Component/Validator/Validator/RecursiveContextualValidator.php @@ -268,6 +268,9 @@ class RecursiveContextualValidator implements ContextualValidatorInterface */ private function traverseClassNode($value, ClassMetadataInterface $metadata = null, $propertyPath, array $groups, $cascadedGroups, $traversalStrategy, ExecutionContextInterface $context) { + // Replace "Default" group by group sequence, if appropriate + $groups = $this->replaceDefaultGroup($value, $metadata, $groups); + $groups = $this->validateNode($value, $value, $metadata, $propertyPath, $groups, $traversalStrategy, $context); if (0 === count($groups)) { @@ -566,10 +569,6 @@ class RecursiveContextualValidator implements ContextualValidatorInterface $context->setMetadata($metadata); $context->setPropertyPath($propertyPath); - if ($metadata instanceof ClassMetadataInterface) { - $groups = $this->replaceDefaultGroup($value, $metadata, $groups); - } - $objectHash = is_object($object) ? spl_object_hash($object) : null; // if group (=[,G3,G4]) contains group sequence (=) @@ -599,18 +598,18 @@ class RecursiveContextualValidator implements ContextualValidatorInterface $context->markObjectAsValidatedForGroup($objectHash, $groupHash); } - // Validate normal group - if (!$group instanceof GroupSequence) { - $this->validateNodeForGroup($value, $objectHash, $metadata, $group, $context); + if ($group instanceof GroupSequence) { + // Traverse group sequence until a violation is generated + $this->stepThroughGroupSequence($value, $object, $metadata, $propertyPath, $traversalStrategy, $group, $context); + + // Skip the group sequence when validating successor nodes + unset($groups[$key]); continue; } - // Traverse group sequence until a violation is generated - $this->stepThroughGroupSequence($value, $object, $metadata, $propertyPath, $traversalStrategy, $group, $context); - - // Skip the group sequence when validating successor nodes - unset($groups[$key]); + // Validate normal group + $this->validateNodeForGroup($value, $objectHash, $metadata, $group, $context); } return $groups;