使用 Symfony 5 中的 FOSRestBundle 转换单个属性以进行响应
Posted
技术标签:
【中文标题】使用 Symfony 5 中的 FOSRestBundle 转换单个属性以进行响应【英文标题】:Convert single property for response with the FOSRestBundle in Symfony 5 【发布时间】:2021-07-09 05:18:34 【问题描述】:我在我的 symfony 应用程序中处理带有很多小数位的数字。例如,在我的学说实体中,我有这个属性:
/**
* @ORM\Column(type="float")
*/
private float $value;
在我的 mysql 数据库中,我有这个值,例如:0.00000000020828579949508
当我在 php 中转储它时,我得到这个:float(9.3722658865184E-7)。我还用 FOSRestBundle 制作了一个 API。在那个 API 中,我想返回不是指数形式的值,至少有 12 个小数位。我认为在这种情况下,我必须将值提供为字符串,对吗?我发现我可以将其转换为字符串,如下所示:sprintf("%.12f", $myEntity->getValue())
。但我现在有两个问题:
-
如何使用 FOSRestBundle 转换单个属性以进行响应?这样我就可以将“value”属性作为字符串返回,即使它通常是浮点数。
在 symfony、Doctor 和 FOSRestBundle 中是否有使用此类数字的一般最佳实践或任何提示?
现在这是我的控制器操作:
public function getData(): Response
$repository = $this->getDoctrine()->getRepository(MyEntity::class);
$data = $repository->findAll();
return $this->handleView($this->view($data));
【问题讨论】:
【参考方案1】:假设您使用的是 Symfony 版本 3.x
,您可以使用 JMS @Expose
和 @Accessor
注释来控制您的实体属性如何序列化为响应数据。更多信息here。但是,如果您只想将实体传递给 Twig 模板渲染引擎,请考虑绕过 JMS。
Doctrine float
列类型是处理较大的浮点数(例如您的浮点数)时使用的正确类型。您的问题与 PHP 设计用于表示这些大浮点数的科学记数法更相关。允许像 2.1E-10 + 2.2E-9
这样的算术运算,但也需要额外的步骤,通过使用像 sprintf
和 number_format
这样的函数将它们的符号转换为更易于阅读的形式。
【讨论】:
以上是关于使用 Symfony 5 中的 FOSRestBundle 转换单个属性以进行响应的主要内容,如果未能解决你的问题,请参考以下文章
Symfony 5 中的 Doctrine Gedmo-Extension (Timestampable, Softdeletable ...) 有替代品吗?