diff --git a/Parser/ValidationParser.php b/Parser/ValidationParser.php index 95ad539..3dcc63a 100644 --- a/Parser/ValidationParser.php +++ b/Parser/ValidationParser.php @@ -73,7 +73,12 @@ class ValidationParser implements ParserInterface, PostParserInterface { $className = $input['class']; - $parsed = $this->doParse($className, array()); + $groups = array(); + if (isset($input["groups"]) && $input["groups"]) { + $groups = $input["groups"]; + } + + $parsed = $this->doParse($className, array(), $groups); if (!isset($input['name']) || empty($input['name'])) { return $parsed; @@ -105,9 +110,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); @@ -126,7 +132,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); } } @@ -143,7 +149,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; @@ -159,9 +165,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']) ); @@ -188,14 +199,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': diff --git a/Tests/Formatter/testFormat-result-no-dunglas.php b/Tests/Formatter/testFormat-result-no-dunglas.php index 66d7b2f..ff3d08b 100644 --- a/Tests/Formatter/testFormat-result-no-dunglas.php +++ b/Tests/Formatter/testFormat-result-no-dunglas.php @@ -396,6 +396,7 @@ With multiple lines.', 'required' => true, 'dataType' => 'string', 'readonly' => NULL, + 'groups' => array ('Default', 'Test'), ), 'b' => array ( @@ -405,6 +406,7 @@ With multiple lines.', 'dataType' => 'DateTime', 'readonly' => NULL, 'required' => NULL, + 'groups' => array ('Default', 'Test'), ), ), ), @@ -2177,6 +2179,7 @@ With multiple lines.', 'dataType' => 'DateTime', 'readonly' => NULL, 'required' => NULL, + 'groups' => array ('Default', 'MultipleTest'), ), 'objects' => array ( @@ -2195,6 +2198,7 @@ With multiple lines.', 'required' => true, 'dataType' => 'string', 'readonly' => NULL, + 'groups' => array ('Default', 'Test'), 'parentClass' => 'Nelmio\ApiDocBundle\Tests\Fixtures\Model\Test', 'field' => 'a', ), @@ -2206,12 +2210,14 @@ With multiple lines.', 'dataType' => 'DateTime', 'readonly' => NULL, 'required' => NULL, + 'groups' => array ('Default', 'Test'), 'parentClass' => 'Nelmio\ApiDocBundle\Tests\Fixtures\Model\Test', 'field' => 'b', ), ), 'readonly' => NULL, 'required' => NULL, + 'groups' => array ('Default', 'MultipleTest'), ), 'number' => array ( @@ -2247,6 +2253,7 @@ With multiple lines.', 'required' => true, 'dataType' => 'string', 'readonly' => NULL, + 'groups' => array ('Default', 'Test'), 'parentClass' => 'Nelmio\ApiDocBundle\Tests\Fixtures\Model\Test', 'field' => 'a', ), @@ -2258,6 +2265,7 @@ With multiple lines.', 'dataType' => 'DateTime', 'readonly' => NULL, 'required' => NULL, + 'groups' => array ('Default', 'Test'), 'parentClass' => 'Nelmio\ApiDocBundle\Tests\Fixtures\Model\Test', 'field' => 'b', ), @@ -2339,6 +2347,7 @@ With multiple lines.', 'dataType' => 'DateTime', 'readonly' => NULL, 'required' => NULL, + 'groups' => array ('Default', 'MultipleTest'), ), 'objects' => array ( @@ -2346,6 +2355,7 @@ With multiple lines.', 'actualType' => 'collection', 'subType' => 'Nelmio\\ApiDocBundle\\Tests\\Fixtures\\Model\\Test', 'dataType' => 'array of objects (Test)', + 'groups' => array('Default', 'MultipleTest'), 'children' => array ( 'a' => @@ -2357,6 +2367,7 @@ With multiple lines.', 'required' => true, 'dataType' => 'string', 'readonly' => NULL, + 'groups' => array ('Default', 'Test'), 'parentClass' => 'Nelmio\ApiDocBundle\Tests\Fixtures\Model\Test', 'field' => 'a', ), @@ -2368,6 +2379,7 @@ With multiple lines.', 'dataType' => 'DateTime', 'readonly' => NULL, 'required' => NULL, + 'groups' => array ('Default', 'Test'), 'parentClass' => 'Nelmio\ApiDocBundle\Tests\Fixtures\Model\Test', 'field' => 'b', ), @@ -2409,6 +2421,7 @@ With multiple lines.', 'required' => true, 'dataType' => 'string', 'readonly' => NULL, + 'groups' => array ('Default', 'Test'), 'parentClass' => 'Nelmio\ApiDocBundle\Tests\Fixtures\Model\Test', 'field' => 'a', ), @@ -2420,6 +2433,7 @@ With multiple lines.', 'dataType' => 'DateTime', 'readonly' => NULL, 'required' => NULL, + 'groups' => array ('Default', 'Test'), 'parentClass' => 'Nelmio\ApiDocBundle\Tests\Fixtures\Model\Test', 'field' => 'b', ), diff --git a/Tests/Formatter/testFormat-result.php b/Tests/Formatter/testFormat-result.php index 50437d9..f72063f 100644 --- a/Tests/Formatter/testFormat-result.php +++ b/Tests/Formatter/testFormat-result.php @@ -389,6 +389,7 @@ With multiple lines.', 'required' => true, 'dataType' => 'string', 'readonly' => NULL, + 'groups' => array('Default', 'Test'), ), 'b' => array ( @@ -398,6 +399,7 @@ With multiple lines.', 'dataType' => 'DateTime', 'readonly' => NULL, 'required' => NULL, + 'groups' => array('Default', 'Test'), ), ), ), @@ -2331,6 +2333,7 @@ With multiple lines.', 'dataType' => 'DateTime', 'readonly' => NULL, 'required' => NULL, + 'groups' => array('Default', 'MultipleTest'), ), 'objects' => array ( @@ -2351,6 +2354,7 @@ With multiple lines.', 'readonly' => NULL, 'parentClass' => 'Nelmio\ApiDocBundle\Tests\Fixtures\Model\Test', 'field' => 'a', + 'groups' => array('Default', 'Test'), ), 'b' => array ( @@ -2362,10 +2366,12 @@ With multiple lines.', 'required' => NULL, 'parentClass' => 'Nelmio\ApiDocBundle\Tests\Fixtures\Model\Test', 'field' => 'b', + 'groups' => array('Default', 'Test'), ), ), 'readonly' => NULL, 'required' => NULL, + 'groups' => array('Default', 'MultipleTest'), ), 'number' => array ( @@ -2403,6 +2409,7 @@ With multiple lines.', 'readonly' => NULL, 'parentClass' => 'Nelmio\ApiDocBundle\Tests\Fixtures\Model\Test', 'field' => 'a', + 'groups' => array('Default', 'Test'), ), 'b' => array ( @@ -2414,6 +2421,7 @@ With multiple lines.', 'required' => NULL, 'parentClass' => 'Nelmio\ApiDocBundle\Tests\Fixtures\Model\Test', 'field' => 'b', + 'groups' => array('Default', 'Test'), ), ), ), @@ -2493,6 +2501,7 @@ With multiple lines.', 'dataType' => 'DateTime', 'readonly' => NULL, 'required' => NULL, + 'groups' => array('Default', 'MultipleTest'), ), 'objects' => array ( @@ -2513,6 +2522,7 @@ With multiple lines.', 'readonly' => NULL, 'parentClass' => 'Nelmio\ApiDocBundle\Tests\Fixtures\Model\Test', 'field' => 'a', + 'groups' => array('Default', 'Test'), ), 'b' => array ( @@ -2524,10 +2534,12 @@ With multiple lines.', 'required' => NULL, 'parentClass' => 'Nelmio\ApiDocBundle\Tests\Fixtures\Model\Test', 'field' => 'b', + 'groups' => array('Default', 'Test'), ), ), 'readonly' => NULL, 'required' => NULL, + 'groups' => array('Default', 'MultipleTest'), ), 'number' => array ( @@ -2565,6 +2577,7 @@ With multiple lines.', 'readonly' => NULL, 'parentClass' => 'Nelmio\ApiDocBundle\Tests\Fixtures\Model\Test', 'field' => 'a', + 'groups' => array('Default', 'Test'), ), 'b' => array ( @@ -2576,6 +2589,7 @@ With multiple lines.', 'required' => NULL, 'parentClass' => 'Nelmio\ApiDocBundle\Tests\Fixtures\Model\Test', 'field' => 'b', + 'groups' => array('Default', 'Test'), ), ), ),