【发布时间】:2014-06-24 08:14:15
【问题描述】:
我有以下场景:我正在验证约会,并且有一个自定义验证器,它告诉用户他选择的日期是否有效。如果该日期已被另一个实体阻止,则该日期无效。这在添加新实体时完美无缺。
现在我想仅在日期本身已更改时才在编辑时触发日期验证。因此,仅更改约会的标题不应验证日期。
我的实体类:
use Doctrine\ORM\Mapping as ORM;
use Acme\Bundle\Validator\Constraints as AcmeAssert;
/**
* Appointment
*
* @ORM\Entity
* @AcmeAssert\DateIsValid
*/
class Appointment
{
/**
* @ORM\Column(name="title", type="string", length=255)
*
* @var string
*/
protected $title;
/**
* @ORM\Column(name="date", type="date")
*
* @var \DateTime
*/
protected $date;
}
验证器类(用作服务):
use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\ConstraintValidator;
/**
* Validates the date of an appointment.
*/
class DateIsValidValidator extends ConstraintValidator
{
/**
* {@inheritdoc}
*/
public function validate($appointment, Constraint $constraint)
{
if (null === $date = $appointment->getDate()) {
return;
}
/* Do some magic to validate date */
if (!$valid) {
$this->context->addViolationAt('date', $constraint->message);
}
}
}
对应的Constraint类被设置为以实体类为目标。
use Symfony\Component\Validator\Constraint;
/**
* @Annotation
*/
class DateIsValid extends Constraint
{
public $message = 'The date is not valid!';
/**
* {@inheritdoc}
*/
public function getTargets()
{
return self::CLASS_CONSTRAINT;
}
/**
* {@inheritdoc}
*/
public function validatedBy()
{
return 'acme.validator.appointment.date';
}
}
现在我找不到依赖日期更改的干净方法。我可以简单地跟踪我的实体中的旧日期,但如果我想实现更复杂的约束,那感觉不是一个合适的解决方案。 :[
干杯
【问题讨论】:
-
要知道字段是否已更改,您应该使用 UnitOfWork。我不知道是否可以在验证上下文中使用它。
-
有几个关于(错误)以这种方式使用 UOW 的主题,我倾向于不接触它。
标签: forms validation symfony constraints