一个接一个地验证日期

时间:2014-05-08 08:51:37

标签: symfony

我有一个表格,其中用户输入3个日期时间,我想检查第二个日期是否在第一个之后,第三个日期在第二个日期之后。怎么做?应该在

之后完成
if ($form->isValid()) {

(就在数据库更新之前)或以某种方式使用验证组(我是symfony2的新手)?

2 个答案:

答案 0 :(得分:2)

如果您的表单是通过映射您要验证的三个日期字段的对象填充的, 然后,您可以考虑使用Custom Validation Constraint

首先,添加一个类似于

的类约束
namespace Namespace\BundleName\Validator\Constraints;

use Symfony\Component\Validator\Constraint;

/**
 * @Annotation
 */
class DateCoherence extends Constraint
{
    public $message = 'The error message you want to show when the validation fails.';

    public function getTargets()
    {
        return self::CLASS_CONSTRAINT;
    }

    public function validatedBy()
    {
        return get_class($this).'Validator'; // You can also use an alias here
    }
}

验证者,

namespace Namespace\BundleName\Validator\Constraints;

use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\ConstraintValidator;

class DateCoherenceValidatorValidator extends ConstraintValidator
{
    public function validate($object, Constraint $constraint)
    {
        if ($object->getFirstDate() > $object->getSecondDate() || $object->getSecondDate() > $object->getThirdDate()) {
            $this->context->addViolation($constraint->message);
        }
    }
}

然后,您的约束应通过

添加到您的班级
use Namespace\BundleName\Validator\Constraints as YourAssert;

/**
 * @YourAssert\DateCoherence(groups={"dates"})
 */
class YourClass
{

在此处添加验证组,您只能在任何地方仅根据约束日期检查验证。 (例如,在您的控制器中)

$errors = $this->get('validator')->validate($object, array('dates'));

答案 1 :(得分:1)

构建自己的约束是一种很好的做法,因为验证器约束可以重用。如果您只需要在某个实体中进行此类验证,则还可以执行此操作:

YML:

Project\Bundle\SomeBundle\Entity\Something:
    getters:
        datesOrderValid:
          - "True": { message: 'Dates are not in valid order.' }

在您的实体中:

public function isDatesOrderValid()
{
    // Compare dates (probably in datetime) here and return true if they are in valid order, otherwise return false
}