由于某些原因,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;