From 7622c3f5fa0067603de6c0ef09e064d5c295ed58 Mon Sep 17 00:00:00 2001 From: Simon Vieille Date: Wed, 18 Mar 2015 11:02:03 +0100 Subject: [PATCH] symfony constraint --- src/Deblan/Validator/Constraints/Csv.php | 25 +++++ .../Validator/Constraints/CsvValidator.php | 99 +++++++++++++++++++ .../{CsvValidator => Validator}/Validator.php | 0 3 files changed, 124 insertions(+) create mode 100644 src/Deblan/Validator/Constraints/Csv.php create mode 100644 src/Deblan/Validator/Constraints/CsvValidator.php rename src/Deblan/{CsvValidator => Validator}/Validator.php (100%) diff --git a/src/Deblan/Validator/Constraints/Csv.php b/src/Deblan/Validator/Constraints/Csv.php new file mode 100644 index 0000000..23c9485 --- /dev/null +++ b/src/Deblan/Validator/Constraints/Csv.php @@ -0,0 +1,25 @@ +context->getViolations()); + + parent::validate($value, $constraint); + + if (null === $constraint->parser) { + throw new \RuntimeException('You must set a CSV parser.'); + } + + if (!is_object($constraint->parser) || !($value instanceof CsvParser)) { + throw new \RuntimeException('You must be an instance of Deblan\\Csv\\CsvParser.'); + } + + if (empty($constraint->fieldsConstraints) && empty($constraint->lineConstraints)) { + return; + } + + $context = $this->context; + $parser = $constraint->parser; + $parser->setFilename($value); + $parser->parse(); + + foreach ($parser->getDatas() as $line => $data) { + if ($parser->getHasLegend() && $line === 0) { + continue; + } + + foreach ($constraint->lineConstraints as $lineConstraint) { + $violations = $this->getConstraintViolations($context, $data, $lineConstraint); + + foreach ($violations as $violation) { + $this->buildViolationInContext($context, $constraint->lineNotValidMessage) + ->setParameter('{{ line }}', $line + 1) + ->setParameter('{{ message }}', $violation->getMessage()) + ->setInvalidValue(null) + ->setCode(Csv::LINE_NOT_VALID) + ->addViolation(); + } + } + + foreach ($constraint->fieldsConstraints as $field => $fieldConstraints) { + if (!array_key_exists($field, $line)) { + $this->buildViolationInContext($context, $constraint->fieldNotDetectedMessage) + ->setParameter('{{ field }}', ctype_digit($field) ? $field + 1 : $field) + ->setParameter('{{ line }}', $line + 1) + ->setParameter('{{ message }}', $violation->getMessage()) + ->setInvalidValue(null) + ->setCode(Csv::FIELD_NOT_DETECTED) + ->addViolation(); + + continue; + } + + foreach ($fieldConstraints as $fieldConstraint) { + $violations = $this->getConstraintViolations($context, $data[$field], $fieldConstraint); + + foreach ($violations as $violation) { + $this->buildViolationInContext($context, $constraint->fieldNotValidMessage) + ->setParameter('{{ field }}', ctype_digit($field) ? $field + 1 : $field) + ->setParameter('{{ line }}', $k + 1) + ->setParameter('{{ message }}', $violation->getMessage()) + ->setInvalidValue(null) + ->setCode(Csv::FIELD_NOT_VALID) + ->addViolation(); + } + } + } + } + } + + protected function getConstraintViolations($context, $data, Constraint $constraint) + { + if ($context instanceof ExecutionContextInterface) { + $violations = $context->getValidator() + ->inContext($context) + ->validate($data, $constraint); + } else { + // 2.4 API + $violations = $context->validateValue($data, $constraint); + } + + return $violations; + } +} diff --git a/src/Deblan/CsvValidator/Validator.php b/src/Deblan/Validator/Validator.php similarity index 100% rename from src/Deblan/CsvValidator/Validator.php rename to src/Deblan/Validator/Validator.php