Symfony 3 + FOS REST Bundle:验证前规范化值

Symfony 3 + FOS REST Bundle: Normalize values before validation

我正在研究 FOS REST API。在底层模型中,我希望能够定义表示适合数据存储的形式的约束,例如,美国 Phone 数字应该正好是 10 位数字。

/**
 * @var string
 *
 * @Assert\NotBlank(message="Phone is required.")
 * @Assert\Regex(message="Exactly 10 digits are required.",  pattern="/^\d{10}$/")
 */
private $phone;

另一方面,我希望能够接受自由值,例如 phone 数字格式为:

{
    "phone": "603-988-6521"
}

实现这一点的理想方法是拥有某种类型的 "conversion" 或 "normalization" 阶段,其中 select 字段可以在验证之前转换为所有数字等。

在 FOST REST 范式和 Symfony 3 中完成此任务的最佳方法是什么?

原来这很简单。您可以在模型的实际设置器中执行任何类型的规范化。您只需将 JMS 序列化程序配置为使用 setter 而不是使用 属性 反射。带注释的示例:

/**
 * @var string
 *
 * @JMS\Accessor(getter="getPhone", setter="setPhone")
 * @Assert\Regex(message="Exactly 10 digits are required.",  pattern="/^\d{10}$/")
 */
private $phone;

/**
 * @param string
 */
public function setPhone($phone)
{
    if ($phone === null) {
        $this->phone = null;
        return;
    }

    $this->phone = preg_replace('/[^0-9]/', '', $phone);
}