Merge pull request #5 from grigoryangeo/master

validation with considering groups
This commit is contained in:
Ilyas Salikhov 2016-04-20 19:11:41 +04:00
commit 25ac3dd92b

View File

@ -69,7 +69,12 @@ class ValidationParser implements ParserInterface, PostParserInterface
{ {
$className = $input['class']; $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'])) { if (!isset($input['name'])) {
return $result; return $result;
@ -100,9 +105,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);
@ -121,7 +127,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);
} }
} }
@ -138,7 +144,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;
@ -154,9 +160,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'])
); );
@ -183,14 +194,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':