【问题标题】:Allowing NULL value in json with API-Platform使用 API 平台在 json 中允许 NULL 值
【发布时间】:2019-12-13 00:52:38
【问题描述】:

我目前有这个实体,我想在我的 JSON 中显示我的属性“firedDate”,即使值为 null。

/**
 * @ApiResource(normalizationContext={"groups"={"employee"}})
 * @ApiFilter(DateFilter::class, properties={"dateProperty": DateFilter::INCLUDE_NULL_BEFORE_AND_AFTER})
 * @ORM\Table(name="employee")
 */
class Employee
{
    // ...

    /**
     * @ORM\Column(type="datetime", nullable=true)
     * @Groups({"employee"})
     */
    private $firedDate;


    public function getFiredDate(): ?\DateTimeInterface
    {
        return $this->firedDate;
    }

    // ...
}

我做错了什么? :/ 谢谢!

【问题讨论】:

标签: php symfony api-platform.com


【解决方案1】:

我想我找到了解决这个问题的正确方法。 在您的normalizationContext 中设置skip_null_values 中的false

 * @ApiResource(
 *     itemOperations={
 *         "get" = {
 *             //...
 *         }
 *         "put" = {
 *             //...
 *         },
 *         "patch" = {
 *             //...
 *         }
 *     },
 *     collectionOperations={
 *         "get",
 *         "post" = {
 *             //...
 *         }
 *     },
 *     normalizationContext={
 *         "skip_null_values" = false,
 *         "groups" = {"object:read"}
 *     },
 *     denormalizationContext={"groups" = {"object:write"}}
 * )

【讨论】:

  • 哦,是的!我更喜欢您的解决方案,“skip_null_values”完成这项工作! :D 谢谢!
  • 我在 api-platform 文档中的任何地方都找不到这个。谢谢你停止了我的头痛!
  • 使用 ApiPlatform 2.6,如果您的实体包含 PATCH 项目操作,则标志 skip_null_values 将设置为 true (github.com/api-platform/core/blob/2.6/src/Serializer/…)。感谢@Winzza 解决方案,您可以覆盖它或从patch_formats 中的api_platform.yaml 中删除application/merge-patch+json
【解决方案2】:

您是否在 PHP 7.0 或更高版本下? 在 PHP 7.1 中,您可以为函数提供可为空的返回类型,因此您的

public function getFiredDate(): ?\DateTime { return $this->firedDate; }

在 \DateTime 之前使用 ?,该函数也将返回 null

【讨论】:

  • 不幸的是我已经有一个这样的吸气剂,我刚刚更新了我的帖子以添加它:/我认为问题来自带有 Api-Platform 的@ApiFilter ...也许我错过了一些东西..
【解决方案3】:

也许您的实体缺少像这样的吸气剂?


public function getFiredDate(): \DateTime
{
  return $this->firedDate;
}

【讨论】:

  • 我的实体是用 make:entity 生成的,所以是的,所有的 setter 和 getter 都已经在那里了。如果值不是“null”,所有工作都很好,但我发现在我的 json 结果中没有“null”会令人困惑。 Api Platform 说我必须输入“DateFilter::INCLUDE_NULL_BEFORE_AND_AFTER”,但即使使用该指令它也不起作用。
【解决方案4】:

从 github 上的朋友那里得到解决方案,这里是:

* @ApiResource(
*      itemOperations={"get"},
* )

之前

{
    "@context": "/contexts/Employee",
    "@id": "/employees/1",
    "@type": "Employee",
    "id": 1,
    "name": "Oliver",
    "hired": "2019-10-10T00:00:00+00:00",
    "experience": 0,
    "salary": "1200.00",
    "job": {
        "@id": "/employee_jobs/1",
        "@type": "EmployeeJob",
        "id": 1,
        "name": "Mécanicien"
    }
}

之后

{
    "@context": "/contexts/Employee",
    "@id": "/employees/1",
    "@type": "Employee",
    "id": 1,
    "name": "Oliver",
    "hired": "2019-10-10T00:00:00+00:00",
    "experience": 0,
    "salary": "1200.00",
    "firedDate": null,
    "job": {
        "@id": "/employee_jobs/1",
        "@type": "EmployeeJob",
        "id": 1,
        "name": "Mécanicien"
    }
}

【讨论】:

    猜你喜欢
    • 2012-08-09
    • 2022-11-10
    • 2020-11-29
    • 1970-01-01
    • 2021-01-18
    • 2023-03-30
    • 2018-03-09
    • 2019-08-09
    • 2019-04-04
    相关资源
    最近更新 更多