API-平台-更新可为空字符串错误
API-Platform - updating nullable string error
我有一个作为 api 平台资源公开的实体,包含以下内容 属性:
/**
* @ORM\Column(type="string", nullable=true)
*/
private $note;
当我尝试更新实体(通过 PUT)时,发送以下 json:
{
"note": null
}
我从 Symfony 序列化程序中得到以下错误:
[2017-06-29 21:47:33] request.CRITICAL: Uncaught PHP Exception Symfony\Component\Serializer\Exception\UnexpectedValueException: "Expected argument of type "string", "NULL" given" at /var/www/html/testapp/server/vendor/symfony/symfony/src/Symfony/Component/Serializer/Normalizer/AbstractObjectNormalizer.php line 196 {"exception":"[object] (Symfony\Component\Serializer\Exception\UnexpectedValueException(code: 0):Expected argument of type \"string\", \"NULL\" given at /var/www/html/testapp/server/vendor/symfony/symfony/src/Symfony/Component/Serializer/Normalizer/AbstractObjectNormalizer.php:196, Symfony\Component\PropertyAccess\Exception\InvalidArgumentException(code: 0): Expected argument of type \"string\", \"NULL\" given at /var/www/html/testapp/server/vendor/symfony/symfony/src/Symfony/Component/PropertyAccess/PropertyAccessor.php:275)"} []
我似乎缺少一些允许此 属性 为空的配置?更奇怪的是,当我获取包含空注释的资源时,该注释正确返回为空:
{
"@context": "/contexts/RentPayment",
"@id": "/rent_payments/1",
"@type": "RentPayment",
"id": 1,
"note": null,
"date": "2016-03-01T00:00:00+00:00"
}
我错过了什么 - ps 我是 api-platform
的新手
好吧,正如评论中所确定的那样,您使用的是提示类型 setter à la:
public function setNote(string $note) {
$this->note = $note;
return $this;
}
从 PHP 7.1 开始,我们有 nullable types,因此以下内容是首选,因为它实际上检查 null 或字符串而不是任何类型。
public function setNote(?string $note = null) {
在以前的版本中,只需删除类型提示,如果愿意,在内部添加一些类型检查。
public function setNote($note) {
if ((null !== $note) && !is_string($note)) {
// throw some type exception!
}
$this->note = $note;
return $this;
}
您可能要考虑的另一件事是使用类似的东西:
$this->note = $note ?: null;
这是 if (ternary operator) 的排序。如果字符串为空(但在“0”上存在错误,因此您可能需要使用更长的版本),将值设置为 null。
我有一个作为 api 平台资源公开的实体,包含以下内容 属性:
/**
* @ORM\Column(type="string", nullable=true)
*/
private $note;
当我尝试更新实体(通过 PUT)时,发送以下 json:
{
"note": null
}
我从 Symfony 序列化程序中得到以下错误:
[2017-06-29 21:47:33] request.CRITICAL: Uncaught PHP Exception Symfony\Component\Serializer\Exception\UnexpectedValueException: "Expected argument of type "string", "NULL" given" at /var/www/html/testapp/server/vendor/symfony/symfony/src/Symfony/Component/Serializer/Normalizer/AbstractObjectNormalizer.php line 196 {"exception":"[object] (Symfony\Component\Serializer\Exception\UnexpectedValueException(code: 0):Expected argument of type \"string\", \"NULL\" given at /var/www/html/testapp/server/vendor/symfony/symfony/src/Symfony/Component/Serializer/Normalizer/AbstractObjectNormalizer.php:196, Symfony\Component\PropertyAccess\Exception\InvalidArgumentException(code: 0): Expected argument of type \"string\", \"NULL\" given at /var/www/html/testapp/server/vendor/symfony/symfony/src/Symfony/Component/PropertyAccess/PropertyAccessor.php:275)"} []
我似乎缺少一些允许此 属性 为空的配置?更奇怪的是,当我获取包含空注释的资源时,该注释正确返回为空:
{
"@context": "/contexts/RentPayment",
"@id": "/rent_payments/1",
"@type": "RentPayment",
"id": 1,
"note": null,
"date": "2016-03-01T00:00:00+00:00"
}
我错过了什么 - ps 我是 api-platform
的新手好吧,正如评论中所确定的那样,您使用的是提示类型 setter à la:
public function setNote(string $note) {
$this->note = $note;
return $this;
}
从 PHP 7.1 开始,我们有 nullable types,因此以下内容是首选,因为它实际上检查 null 或字符串而不是任何类型。
public function setNote(?string $note = null) {
在以前的版本中,只需删除类型提示,如果愿意,在内部添加一些类型检查。
public function setNote($note) {
if ((null !== $note) && !is_string($note)) {
// throw some type exception!
}
$this->note = $note;
return $this;
}
您可能要考虑的另一件事是使用类似的东西:
$this->note = $note ?: null;
这是 if (ternary operator) 的排序。如果字符串为空(但在“0”上存在错误,因此您可能需要使用更长的版本),将值设置为 null。