我有一个作为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的重要新手
答案 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',因此您可能需要执行更长的版本)。