在API平台的实体中定义数字时出现问题



由于某些原因,API平台在定义实体时忽略数字类型并强制字符串。API是为JSON API配置的。

以下是一个缩写示例:

/**
* @ApiProperty(
*     attributes={
*         "swagger_context"={
*             "type"="decimal",
*             "example"="15.00",
*             "description"="..."
* }})
* @AssertType("numeric")  
* @ORMColumn(type="decimal", precision=2, nullable=false, length=6, options={"default":0})
* @var double
*/
public $flatFee = 0;

然而,当我试图将数据作为数字发布时,我会遇到一个类型错误,期望得到一个字符串。

{
"data": {
"type": "my-entity",
"id": "4",
"attributes": {
.....
"flatFee": 15,   <-- Succeeds only when "15"

"flatFee"属性的类型必须是"string",给定为"integer">

我认为你的问题不是来自Api平台,而是对十进制类型的误解。

对于Doctrine,Decimal类型是一个PHP字符串,而不是双精度字符串,它在数据库中被转换为十进制。

从数据库检索到的值总是转换为PHP的字符串类型,如果没有数据,则转换为null。

创建实体时,应考虑使用Symfony maker捆绑包。例如,当我创建一个具有foodecimal属性的Test实体时,生成的代码将是:

$ symfony console make:entity Test

我输入foo作为属性名称,输入decimal作为类型,然后输入5作为数字

<?php
namespace AppEntity;
use DoctrineORMMapping as ORM;
/**
* @ORMEntity(repositoryClass="AppRepositoryTestRepository")
*/
class Test
{
/**
* @ORMId()
* @ORMGeneratedValue()
* @ORMColumn(type="integer")
*/
private $id;
/**
* @ORMColumn(type="decimal", precision=5, scale=2)
*/
private $foo;
public function getId(): ?int
{
return $this->id;
}
public function getFoo(): ?string
{
return $this->foo;
}
public function setFoo(string $foo): self
{
$this->foo = $foo;
return $this;
}
}

正如您所看到的,foo是一个十进制,但是getter和setter应该返回并接受字符串值。

所以,你招摇过市的背景应该是:

/**
* @ApiProperty(
*     attributes={
*         "swagger_context"={
*             "type"="string",
*             "example"="15.00",
*             "description"="A string representing a 6.2 decimal"
* }})
* @AssertType("numeric")  
* @ORMColumn(type="decimal", precision=2, nullable=false, length=6, options={"default":0})
* @var string
*/
public $flatFee = 0;

相关内容

  • 没有找到相关文章

最新更新