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组件 的标记法,因此你可以指代内嵌对象的属性。