Validation with considering groups

This commit is contained in:
Vitaliy Chesnokov 2019-04-24 19:08:53 +03:00
parent d78f8887a9
commit 39d640cce8
No known key found for this signature in database
GPG Key ID: FD23DF1B48ECC3EB
3 changed files with 65 additions and 6 deletions

View File

@ -73,7 +73,12 @@ class ValidationParser implements ParserInterface, PostParserInterface
{ {
$className = $input['class']; $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'])) { if (!isset($input['name']) || empty($input['name'])) {
return $parsed; return $parsed;
@ -105,9 +110,10 @@ class ValidationParser implements ParserInterface, PostParserInterface
* *
* @param $className * @param $className
* @param array $visited * @param array $visited
* @param array $groups
* @return array * @return array
*/ */
protected function doParse($className, array $visited) protected function doParse($className, array $visited, array $groups = array())
{ {
$params = array(); $params = array();
$classdata = $this->factory->getMetadataFor($className); $classdata = $this->factory->getMetadataFor($className);
@ -126,7 +132,7 @@ class ValidationParser implements ParserInterface, PostParserInterface
$constraints = $propdata->getConstraints(); $constraints = $propdata->getConstraints();
foreach ($constraints as $constraint) { 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 // check for nested classes with All constraint
if (isset($vparams['class']) && !in_array($vparams['class'], $visited) && null !== $this->factory->getMetadataFor($vparams['class'])) { if (isset($vparams['class']) && !in_array($vparams['class'], $visited) && null !== $this->factory->getMetadataFor($vparams['class'])) {
$visited[] = $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; $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) public function postParse(array $input, array $parameters)
{ {
$groups = [];
if (isset($input["groups"]) && $input["groups"]) {
$groups = $input["groups"];
}
foreach ($parameters as $param => $data) { foreach ($parameters as $param => $data) {
if (isset($data['class']) && isset($data['children'])) { 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'] = array_merge(
$parameters[$param]['children'], $this->postParse($input, $parameters[$param]['children']) $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 Constraint $constraint The constraint metadata object.
* @param array $vparams The existing validation parameters. * @param array $vparams The existing validation parameters.
* @param array $groups Validation groups.
* @return mixed The parsed list of validation parameters. * @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\\')); $class = substr(get_class($constraint), strlen('Symfony\\Component\\Validator\\Constraints\\'));
$vparams['actualType'] = DataTypes::STRING; $vparams['actualType'] = DataTypes::STRING;
$vparams['subType'] = null; $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) { switch ($class) {
case 'NotBlank': case 'NotBlank':

View File

@ -396,6 +396,7 @@ With multiple lines.',
'required' => true, 'required' => true,
'dataType' => 'string', 'dataType' => 'string',
'readonly' => NULL, 'readonly' => NULL,
'groups' => array ('Default', 'Test'),
), ),
'b' => 'b' =>
array ( array (
@ -405,6 +406,7 @@ With multiple lines.',
'dataType' => 'DateTime', 'dataType' => 'DateTime',
'readonly' => NULL, 'readonly' => NULL,
'required' => NULL, 'required' => NULL,
'groups' => array ('Default', 'Test'),
), ),
), ),
), ),
@ -2177,6 +2179,7 @@ With multiple lines.',
'dataType' => 'DateTime', 'dataType' => 'DateTime',
'readonly' => NULL, 'readonly' => NULL,
'required' => NULL, 'required' => NULL,
'groups' => array ('Default', 'MultipleTest'),
), ),
'objects' => 'objects' =>
array ( array (
@ -2195,6 +2198,7 @@ With multiple lines.',
'required' => true, 'required' => true,
'dataType' => 'string', 'dataType' => 'string',
'readonly' => NULL, 'readonly' => NULL,
'groups' => array ('Default', 'Test'),
'parentClass' => 'Nelmio\ApiDocBundle\Tests\Fixtures\Model\Test', 'parentClass' => 'Nelmio\ApiDocBundle\Tests\Fixtures\Model\Test',
'field' => 'a', 'field' => 'a',
), ),
@ -2206,12 +2210,14 @@ With multiple lines.',
'dataType' => 'DateTime', 'dataType' => 'DateTime',
'readonly' => NULL, 'readonly' => NULL,
'required' => NULL, 'required' => NULL,
'groups' => array ('Default', 'Test'),
'parentClass' => 'Nelmio\ApiDocBundle\Tests\Fixtures\Model\Test', 'parentClass' => 'Nelmio\ApiDocBundle\Tests\Fixtures\Model\Test',
'field' => 'b', 'field' => 'b',
), ),
), ),
'readonly' => NULL, 'readonly' => NULL,
'required' => NULL, 'required' => NULL,
'groups' => array ('Default', 'MultipleTest'),
), ),
'number' => 'number' =>
array ( array (
@ -2247,6 +2253,7 @@ With multiple lines.',
'required' => true, 'required' => true,
'dataType' => 'string', 'dataType' => 'string',
'readonly' => NULL, 'readonly' => NULL,
'groups' => array ('Default', 'Test'),
'parentClass' => 'Nelmio\ApiDocBundle\Tests\Fixtures\Model\Test', 'parentClass' => 'Nelmio\ApiDocBundle\Tests\Fixtures\Model\Test',
'field' => 'a', 'field' => 'a',
), ),
@ -2258,6 +2265,7 @@ With multiple lines.',
'dataType' => 'DateTime', 'dataType' => 'DateTime',
'readonly' => NULL, 'readonly' => NULL,
'required' => NULL, 'required' => NULL,
'groups' => array ('Default', 'Test'),
'parentClass' => 'Nelmio\ApiDocBundle\Tests\Fixtures\Model\Test', 'parentClass' => 'Nelmio\ApiDocBundle\Tests\Fixtures\Model\Test',
'field' => 'b', 'field' => 'b',
), ),
@ -2339,6 +2347,7 @@ With multiple lines.',
'dataType' => 'DateTime', 'dataType' => 'DateTime',
'readonly' => NULL, 'readonly' => NULL,
'required' => NULL, 'required' => NULL,
'groups' => array ('Default', 'MultipleTest'),
), ),
'objects' => 'objects' =>
array ( array (
@ -2346,6 +2355,7 @@ With multiple lines.',
'actualType' => 'collection', 'actualType' => 'collection',
'subType' => 'Nelmio\\ApiDocBundle\\Tests\\Fixtures\\Model\\Test', 'subType' => 'Nelmio\\ApiDocBundle\\Tests\\Fixtures\\Model\\Test',
'dataType' => 'array of objects (Test)', 'dataType' => 'array of objects (Test)',
'groups' => array('Default', 'MultipleTest'),
'children' => 'children' =>
array ( array (
'a' => 'a' =>
@ -2357,6 +2367,7 @@ With multiple lines.',
'required' => true, 'required' => true,
'dataType' => 'string', 'dataType' => 'string',
'readonly' => NULL, 'readonly' => NULL,
'groups' => array ('Default', 'Test'),
'parentClass' => 'Nelmio\ApiDocBundle\Tests\Fixtures\Model\Test', 'parentClass' => 'Nelmio\ApiDocBundle\Tests\Fixtures\Model\Test',
'field' => 'a', 'field' => 'a',
), ),
@ -2368,6 +2379,7 @@ With multiple lines.',
'dataType' => 'DateTime', 'dataType' => 'DateTime',
'readonly' => NULL, 'readonly' => NULL,
'required' => NULL, 'required' => NULL,
'groups' => array ('Default', 'Test'),
'parentClass' => 'Nelmio\ApiDocBundle\Tests\Fixtures\Model\Test', 'parentClass' => 'Nelmio\ApiDocBundle\Tests\Fixtures\Model\Test',
'field' => 'b', 'field' => 'b',
), ),
@ -2409,6 +2421,7 @@ With multiple lines.',
'required' => true, 'required' => true,
'dataType' => 'string', 'dataType' => 'string',
'readonly' => NULL, 'readonly' => NULL,
'groups' => array ('Default', 'Test'),
'parentClass' => 'Nelmio\ApiDocBundle\Tests\Fixtures\Model\Test', 'parentClass' => 'Nelmio\ApiDocBundle\Tests\Fixtures\Model\Test',
'field' => 'a', 'field' => 'a',
), ),
@ -2420,6 +2433,7 @@ With multiple lines.',
'dataType' => 'DateTime', 'dataType' => 'DateTime',
'readonly' => NULL, 'readonly' => NULL,
'required' => NULL, 'required' => NULL,
'groups' => array ('Default', 'Test'),
'parentClass' => 'Nelmio\ApiDocBundle\Tests\Fixtures\Model\Test', 'parentClass' => 'Nelmio\ApiDocBundle\Tests\Fixtures\Model\Test',
'field' => 'b', 'field' => 'b',
), ),

View File

@ -389,6 +389,7 @@ With multiple lines.',
'required' => true, 'required' => true,
'dataType' => 'string', 'dataType' => 'string',
'readonly' => NULL, 'readonly' => NULL,
'groups' => array('Default', 'Test'),
), ),
'b' => 'b' =>
array ( array (
@ -398,6 +399,7 @@ With multiple lines.',
'dataType' => 'DateTime', 'dataType' => 'DateTime',
'readonly' => NULL, 'readonly' => NULL,
'required' => NULL, 'required' => NULL,
'groups' => array('Default', 'Test'),
), ),
), ),
), ),
@ -2331,6 +2333,7 @@ With multiple lines.',
'dataType' => 'DateTime', 'dataType' => 'DateTime',
'readonly' => NULL, 'readonly' => NULL,
'required' => NULL, 'required' => NULL,
'groups' => array('Default', 'MultipleTest'),
), ),
'objects' => 'objects' =>
array ( array (
@ -2351,6 +2354,7 @@ With multiple lines.',
'readonly' => NULL, 'readonly' => NULL,
'parentClass' => 'Nelmio\ApiDocBundle\Tests\Fixtures\Model\Test', 'parentClass' => 'Nelmio\ApiDocBundle\Tests\Fixtures\Model\Test',
'field' => 'a', 'field' => 'a',
'groups' => array('Default', 'Test'),
), ),
'b' => 'b' =>
array ( array (
@ -2362,10 +2366,12 @@ With multiple lines.',
'required' => NULL, 'required' => NULL,
'parentClass' => 'Nelmio\ApiDocBundle\Tests\Fixtures\Model\Test', 'parentClass' => 'Nelmio\ApiDocBundle\Tests\Fixtures\Model\Test',
'field' => 'b', 'field' => 'b',
'groups' => array('Default', 'Test'),
), ),
), ),
'readonly' => NULL, 'readonly' => NULL,
'required' => NULL, 'required' => NULL,
'groups' => array('Default', 'MultipleTest'),
), ),
'number' => 'number' =>
array ( array (
@ -2403,6 +2409,7 @@ With multiple lines.',
'readonly' => NULL, 'readonly' => NULL,
'parentClass' => 'Nelmio\ApiDocBundle\Tests\Fixtures\Model\Test', 'parentClass' => 'Nelmio\ApiDocBundle\Tests\Fixtures\Model\Test',
'field' => 'a', 'field' => 'a',
'groups' => array('Default', 'Test'),
), ),
'b' => 'b' =>
array ( array (
@ -2414,6 +2421,7 @@ With multiple lines.',
'required' => NULL, 'required' => NULL,
'parentClass' => 'Nelmio\ApiDocBundle\Tests\Fixtures\Model\Test', 'parentClass' => 'Nelmio\ApiDocBundle\Tests\Fixtures\Model\Test',
'field' => 'b', 'field' => 'b',
'groups' => array('Default', 'Test'),
), ),
), ),
), ),
@ -2493,6 +2501,7 @@ With multiple lines.',
'dataType' => 'DateTime', 'dataType' => 'DateTime',
'readonly' => NULL, 'readonly' => NULL,
'required' => NULL, 'required' => NULL,
'groups' => array('Default', 'MultipleTest'),
), ),
'objects' => 'objects' =>
array ( array (
@ -2513,6 +2522,7 @@ With multiple lines.',
'readonly' => NULL, 'readonly' => NULL,
'parentClass' => 'Nelmio\ApiDocBundle\Tests\Fixtures\Model\Test', 'parentClass' => 'Nelmio\ApiDocBundle\Tests\Fixtures\Model\Test',
'field' => 'a', 'field' => 'a',
'groups' => array('Default', 'Test'),
), ),
'b' => 'b' =>
array ( array (
@ -2524,10 +2534,12 @@ With multiple lines.',
'required' => NULL, 'required' => NULL,
'parentClass' => 'Nelmio\ApiDocBundle\Tests\Fixtures\Model\Test', 'parentClass' => 'Nelmio\ApiDocBundle\Tests\Fixtures\Model\Test',
'field' => 'b', 'field' => 'b',
'groups' => array('Default', 'Test'),
), ),
), ),
'readonly' => NULL, 'readonly' => NULL,
'required' => NULL, 'required' => NULL,
'groups' => array('Default', 'MultipleTest'),
), ),
'number' => 'number' =>
array ( array (
@ -2565,6 +2577,7 @@ With multiple lines.',
'readonly' => NULL, 'readonly' => NULL,
'parentClass' => 'Nelmio\ApiDocBundle\Tests\Fixtures\Model\Test', 'parentClass' => 'Nelmio\ApiDocBundle\Tests\Fixtures\Model\Test',
'field' => 'a', 'field' => 'a',
'groups' => array('Default', 'Test'),
), ),
'b' => 'b' =>
array ( array (
@ -2576,6 +2589,7 @@ With multiple lines.',
'required' => NULL, 'required' => NULL,
'parentClass' => 'Nelmio\ApiDocBundle\Tests\Fixtures\Model\Test', 'parentClass' => 'Nelmio\ApiDocBundle\Tests\Fixtures\Model\Test',
'field' => 'b', 'field' => 'b',
'groups' => array('Default', 'Test'),
), ),
), ),
), ),