使用 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 这样的算术运算,但也需要额外的步骤,通过使用像 sprintfnumber_format 这样的函数将它们的符号转换为更易于阅读的形式。

【讨论】:

以上是关于使用 Symfony 5 中的 FOSRestBundle 转换单个属性以进行响应的主要内容,如果未能解决你的问题,请参考以下文章

Symfony 5异常找不到驱动程序

Symfony 5 中的 Doctrine Gedmo-Extension (Timestampable, Softdeletable ...) 有替代品吗?

Symfony 5 如何为 argon2 存储盐?

如何将容器中的 symfony 5 DATABASE_URL(在 .env 中)连接到本地主机上的 wamp

在选择类型 Symfony 5 中显示相关实体中的特定字段

Symfony 5 处理外部工具的访问(knpsnappy)