'Be', 'hobbies' => array( array( 'name' => 'Hiking', 'frequency' => 'monthly', ), array( 'name' => 'Cooking', ), ) ); // Validate values $constraint = new Collection(array( 'firstName' => new Required(array( new NotBlank(), new Length(array('min' => 3)), )), 'lastName' => new Required(array( new NotBlank(), new Length(array('min' => 3)), )), 'hobbies' => new Optional(array( new Type('array'), new All( new Collection(array( 'name' => new Required(array( new NotBlank(), new Length(array('min' => 3)), )), 'frequency' => new Required(array( new Choice(array('daily', 'weekly', 'monthly')), )) )) ), )), )); $violations = $validator->validateValue($array, $constraint); // Use the same structure for the errors $errors = array(); foreach ($violations as $violation) { /** @var ConstraintViolationInterface $violation */ $entryErrors = (array) $propertyAccessor->getValue($errors, $violation->getPropertyPath()); $entryErrors[] = $violation->getMessage(); $propertyAccessor->setValue($errors, $violation->getPropertyPath(), $entryErrors); } var_export($errors); echo "\n";