API平台 - 更新可空字符串错误

时间:2017-06-29 22:22:05

标签: symfony api-platform.com

我有一个作为api-platform资源公开的实体,并包含以下属性:

/**
 * @ORM\Column(type="string", nullable=true)
 */
private $note;

当我尝试更新实体(通过PUT)时,发送以下json:

{
  "note": null
}

我从Symfony Serializer中收到以下错误:

  

[2017-06-29 21:47:33] request.CRITICAL:未捕获PHP异常Symfony \ Component \ Serializer \ Exception \ UnexpectedValueException:"类型"字符串",&的预期参数#34; NULL"给定" at /var/www/html/testapp/server/vendor/symfony/symfony/src/Symfony/Component/Serializer/Normalizer/AbstractObjectNormalizer.php第196行{"例外":" [对象] (Symfony \ Component \ Serializer \ Exception \ UnexpectedValueException(code:0):类型为\"字符串\",\" NULL \"在/ var / www /处给出的预期参数html / testapp / server / vendor / symfony / symfony / src / Symfony / Component / Serializer / Normalizer / AbstractObjectNormalizer.php:196,Symfony \ Component \ PropertyAccess \ Exception \ InvalidArgumentException(code:0):类型为\&#的预期参数34;字符串\",\" NULL \"在/var/www/html/testapp/server/vendor/symfony/symfony/src/Symfony/Component/PropertyAccess/PropertyAccessor.php中给出:275)"} []

似乎我错过了一些配置以允许此属性上的空值?为了使事情变得更奇怪,当我获取包含空注释的资源时,注释正确地返回为null:

{
  "@context": "/contexts/RentPayment",
  "@id": "/rent_payments/1",
  "@type": "RentPayment",
  "id": 1,
  "note": null,
  "date": "2016-03-01T00:00:00+00:00"
}

我缺少什么 - ps我是api-platform的重要新手

1 个答案:

答案 0 :(得分:2)

好的,然后在评论中确定您使用的是类型暗示的设置器:

public function setNote(string $note) {
    $this->note = $note;
    return $this;
}

从PHP 7.1开始,我们有nullable types所以以下是首选,因为它实际上是检查null或字符串而不是任何类型。

public function setNote(?string $note) {

在以前的版本中,只需删除类型提示,如果愿意,可在内部添加一些类型检查。

public function setNote($note) {
    if ((null !== $note) && !is_string($note)) {
        // throw some type exception!
    }

    $this->note = $note;
    return $this;
}

您可能想要考虑的另一件事是:

$this->note = $note ?: null;

这是(ternary operator)的排序。如果字符串为空,则将值设置为null(但错误为'0',因此您可能需要执行更长的版本)。