namespace Symfony\Component\Validator\Constraints;
-use Symfony\Component\Validator\Context\ExecutionContextInterface;
use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\Exception\UnexpectedTypeException;
/**
* @author Bernhard Schussek <bschussek@gmail.com>
+ * @author Diego Saint Esteben <diego@saintesteben.me>
*/
class DateTimeValidator extends DateValidator
{
+ /**
+ * @deprecated since version 3.1, to be removed in 4.0.
+ */
const PATTERN = '/^(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})$/';
/**
throw new UnexpectedTypeException($constraint, __NAMESPACE__.'\DateTime');
}
- if (null === $value || '' === $value || $value instanceof \DateTime) {
+ if (null === $value || '' === $value || $value instanceof \DateTimeInterface) {
return;
}
$value = (string) $value;
- if (!preg_match(static::PATTERN, $value, $matches)) {
- if ($this->context instanceof ExecutionContextInterface) {
- $this->context->buildViolation($constraint->message)
- ->setParameter('{{ value }}', $this->formatValue($value))
- ->setCode(DateTime::INVALID_FORMAT_ERROR)
- ->addViolation();
- } else {
- $this->buildViolation($constraint->message)
- ->setParameter('{{ value }}', $this->formatValue($value))
- ->setCode(DateTime::INVALID_FORMAT_ERROR)
- ->addViolation();
- }
+ \DateTime::createFromFormat($constraint->format, $value);
+
+ $errors = \DateTime::getLastErrors();
+
+ if (0 < $errors['error_count']) {
+ $this->context->buildViolation($constraint->message)
+ ->setParameter('{{ value }}', $this->formatValue($value))
+ ->setCode(DateTime::INVALID_FORMAT_ERROR)
+ ->addViolation();
return;
}
- if (!DateValidator::checkDate($matches[1], $matches[2], $matches[3])) {
- if ($this->context instanceof ExecutionContextInterface) {
+ foreach ($errors['warnings'] as $warning) {
+ if ('The parsed date was invalid' === $warning) {
$this->context->buildViolation($constraint->message)
->setParameter('{{ value }}', $this->formatValue($value))
->setCode(DateTime::INVALID_DATE_ERROR)
->addViolation();
- } else {
- $this->buildViolation($constraint->message)
- ->setParameter('{{ value }}', $this->formatValue($value))
- ->setCode(DateTime::INVALID_DATE_ERROR)
- ->addViolation();
- }
- }
-
- if (!TimeValidator::checkTime($matches[4], $matches[5], $matches[6])) {
- if ($this->context instanceof ExecutionContextInterface) {
+ } elseif ('The parsed time was invalid' === $warning) {
$this->context->buildViolation($constraint->message)
->setParameter('{{ value }}', $this->formatValue($value))
->setCode(DateTime::INVALID_TIME_ERROR)
->addViolation();
} else {
- $this->buildViolation($constraint->message)
+ $this->context->buildViolation($constraint->message)
->setParameter('{{ value }}', $this->formatValue($value))
- ->setCode(DateTime::INVALID_TIME_ERROR)
+ ->setCode(DateTime::INVALID_FORMAT_ERROR)
->addViolation();
}
}