From 2ba8a5e2c194874d4dbca1ca0019caaacaeb12cd Mon Sep 17 00:00:00 2001 From: Georgy Grigoryan Date: Fri, 15 Apr 2016 15:38:07 +0300 Subject: [PATCH] validation with considering groups --- Parser/ValidationParser.php | 45 +++++++++++++++++++++++++++++++------ 1 file changed, 38 insertions(+), 7 deletions(-) diff --git a/Parser/ValidationParser.php b/Parser/ValidationParser.php index 834a0a3..02bf1d0 100644 --- a/Parser/ValidationParser.php +++ b/Parser/ValidationParser.php @@ -69,7 +69,12 @@ class ValidationParser implements ParserInterface, PostParserInterface { $className = $input['class']; - $result = $this->doParse($className, array()); + $groups = array(); + if (isset($input["groups"]) && $input["groups"]) { + $groups = $input["groups"]; + } + + $result = $this->doParse($className, array(), $groups); if (!isset($input['name'])) { return $result; @@ -100,9 +105,10 @@ class ValidationParser implements ParserInterface, PostParserInterface * * @param $className * @param array $visited + * @param array $groups * @return array */ - protected function doParse($className, array $visited) + protected function doParse($className, array $visited, array $groups = array()) { $params = array(); $classdata = $this->factory->getMetadataFor($className); @@ -121,7 +127,7 @@ class ValidationParser implements ParserInterface, PostParserInterface $constraints = $propdata->getConstraints(); foreach ($constraints as $constraint) { - $vparams = $this->parseConstraint($constraint, $vparams, $className, $visited); + $vparams = $this->parseConstraint($constraint, $vparams, $className, $visited, $groups); } } @@ -138,7 +144,7 @@ class ValidationParser implements ParserInterface, PostParserInterface // check for nested classes with All constraint if (isset($vparams['class']) && !in_array($vparams['class'], $visited) && null !== $this->factory->getMetadataFor($vparams['class'])) { $visited[] = $vparams['class']; - $vparams['children'] = $this->doParse($vparams['class'], $visited); + $vparams['children'] = $this->doParse($vparams['class'], $visited, $groups); } $vparams['actualType'] = isset($vparams['actualType']) ? $vparams['actualType'] : DataTypes::STRING; @@ -154,9 +160,14 @@ class ValidationParser implements ParserInterface, PostParserInterface */ public function postParse(array $input, array $parameters) { + $groups = []; + if (isset($input["groups"]) && $input["groups"]) { + $groups = $input["groups"]; + } + foreach ($parameters as $param => $data) { if (isset($data['class']) && isset($data['children'])) { - $input = array('class' => $data['class']); + $input = array('class' => $data['class'], "groups" => $groups); $parameters[$param]['children'] = array_merge( $parameters[$param]['children'], $this->postParse($input, $parameters[$param]['children']) ); @@ -183,14 +194,34 @@ class ValidationParser implements ParserInterface, PostParserInterface * * @param Constraint $constraint The constraint metadata object. * @param array $vparams The existing validation parameters. + * @param array $groups Validation groups. * @return mixed The parsed list of validation parameters. */ - protected function parseConstraint(Constraint $constraint, $vparams, $className, &$visited = array()) - { + protected function parseConstraint( + Constraint $constraint, + $vparams, + $className, + &$visited = array(), + array $groups = array() + ) { $class = substr(get_class($constraint), strlen('Symfony\\Component\\Validator\\Constraints\\')); $vparams['actualType'] = DataTypes::STRING; $vparams['subType'] = null; + $vparams['groups'] = $constraint->groups; + + if ($groups) { + $containGroup = false; + foreach ($groups as $group) { + if (in_array($group, $vparams['groups'])) { + $containGroup = true; + } + } + + if (!$containGroup) { + return $vparams; + } + } switch ($class) { case 'NotBlank':