Symfony 3+FOS REST捆绑包:在验证之前规范化值


Symfony 3 + FOS REST Bundle: Normalize values before validation

我正在开发FOS REST API。在底层模型中,我希望能够定义表示适用于数据存储的形式的Constraints,例如,US电话号码应该正好是10位数字。

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

另一方面,我希望能够接受自由值,例如格式化为的电话号码

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

实现这一点的理想方法是进行某种类型的"转换"或"规范化"阶段,在验证之前,可以将选择字段转换为所有数字等。

在FOST REST范式和Symfony 3中,实现这一点的最佳方式是什么?

事实证明,这非常简单。您可以在模型的实际setter中执行所需的任何类型的规范化。您只需要将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);
}