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