如何配置Symfony序列化器组件以规范对象(实体)的float属性?
详细信息:学说实体的taxRate
属性被映射到PHP浮点值。我想用类似JSON表示的控制器响应:
{taxRate:0.19}
但是我得到的是
{taxRate:"0.19"}
实体属性和注释的定义为:
class ExampleEntity {
/**
* @ORM\Column(type="decimal", precision=3, scale=2, nullable=true)
* @Groups({"api"})
*/
protected $taxRate;
}
控制器看起来像这样:
$serializer = $this->get('serializer');
return new JsonResponse(
$serializer->normalize(
$exampleEntity,
'json',
[
'groups' => 'api',
]
)
);
我不喜欢将字符串转换为JavaScript端上的Float的解决方案。我的应用程序想断言该属性为NULL还是Float值。
这怎么办?
答案 0 :(得分:1)
感谢评论,我认为问题不是很清楚/可以删除。
序列化过程很好,这是我不正确的从教义的映射。
完全没关系,DECIMAL Doctrine / MySQL类型被映射到PHP字符串。 DECIMAL旨在确保数字值的精度。 PHP的float类型不能保证相同的精度。
答案 1 :(得分:0)
我在Symfony 4.4序列化程序中遇到了同样的问题,我不同意您的解决方案。我已经通过将type =“ decimal”更改为type =“ float”解决了我的问题,正如某些人已经在评论中建议的那样。正确的类型提示是一种好习惯。为什么可以使用浮点数时使用字符串?
浮点类型,来自准则文档:
https://www.doctrine-project.org/projects/doctrine-dbal/en/2.12/reference/types.html#types
以浮点精度映射和转换数字数据。如果你 只需要分数的近似精度,您 应该考虑使用这种类型。从数据库检索的值 总是转换为PHP的float / double类型;如果没有数据,则返回null 礼物。
有关此方法的一些其他信息:
序列化程序的float属性示例:
/**
* @var float|null
* @ORM\Column(type="float", precision=6, scale=2, nullable=true)
*/
protected $ratio;
/**
* @return float|null
*/
public function getRatio(): ?float
{
return $this->ratio;
}
/**
* @param float|null $ratio
* @return $this
*/
public function setRatio(?float $ratio): self
{
$this->ratio = $ratio;
return $this;
}
答案 2 :(得分:0)
如果要使用十进制,请更改属性的吸气剂
public function getTaxRage(): ?float
{
return is_string($this->taxRate) ? (float) $this->taxRate : $this->taxRate;
}