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'];
$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':

View File

@ -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',
),

View File

@ -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'),
),
),
),