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);
}
我正在研究 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);
}