comparison constraints 比较约束的原本目标是要针对某些预定义值 (如 "the price must be greater than 0 / 价格要大于0", "the age must be greater or equal than 18 / 年龄必须大于等于18", 等等) 来验证(对象的)属性。

然而在 Symfony 程序中,去比较对象属性的两个值是很常见的 (如 "the end date is greater than the start date / 结束日期须大于开始日期", "the plain password is not identical to the login / 密码不可等同于登录密码", 等等)。

这种情况下你可以使用 Expression constraint 去定义表达式来比较两个属性:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
use Symfony\Component\Validator\Constraints as Assert;
 
class Event
{
    /** @Assert\DateTime() */
    private $startDate;
 
    /**
     * @Assert\DateTime()
     * @Assert\Expression("value > this.startDate")
     */
    private $endDate;
 
    // ...
}

在 Symfony 3.4 中我们改进了 comparison expressions 以接收一个全新选项,名为 propertyPath,它定义了“你希望比较其值”的属性之路径:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
use Symfony\Component\Validator\Constraints as Assert;
 
class Event
{
    /** @Assert\DateTime() */
    private $startDate;
 
    /**
     * @Assert\DateTime()
     * @Assert\GreaterThan(propertyPath="startDate")
     */
    private $endDate;
 
    // ...
}

propertyPath 选项的值可以是任何有效的 PropertyAccess组件 的标记法,因此你可以指代内嵌对象的属性。