Проблемы с определением чисел в сущностях в платформе API - PullRequest
0 голосов
/ 02 мая 2020

По какой-то причине API Platform игнорирует числовые типы и вводит строки при определении сущностей. API настроен для JSON API.

Вот сокращенный пример:

/**
  * @ApiProperty(
  *     attributes={
  *         "swagger_context"={
  *             "type"="decimal",
  *             "example"="15.00",
  *             "description"="..."
  * }})
  * @Assert\Type("numeric")  
  * @ORM\Column(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".

1 Ответ

0 голосов
/ 02 мая 2020

Я думаю, что ваша проблема не в Api-Platform, а в неправильном понимании десятичного типа.

С Doctrine, Десятичный тип - это строка PHP , а не двойной, который преобразуется в десятичную в базе данных.

Значения, извлеченные из базы данных, всегда преобразуются в строковый тип PHP или ноль, если данные отсутствуют.

Вам следует рассмотреть возможность использования Symfony maker bundle при создании ваших сущностей. Например, когда я создаю объект Test с десятичным свойством foo, сгенерированный код будет иметь вид:

$ symfony console make:entity Test

Я ввел foo для имени свойства, десятичный для типа и 5, затем 2 для числа

<?php

namespace App\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity(repositoryClass="App\Repository\TestRepository")
 */
class Test
{
    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    private $id;

    /**
     * @ORM\Column(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 является десятичным числом, но метод получения и установки должен возвращать и принимать строковые значения.

Таким образом, ваш контекст чванства должен быть :

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